2017-04-12 64 views
3

我在通用列表中获取记录时遇到问题。我创建了一个通用函数,我想从任何类的类中获取记录。以下是示例代码: -从通用列表中查找项目

public void Test<T>(List<T> rEntity) where T : class 
{ 
    object id = 1; 
    var result = rEntity.Where(x => x.id == id); 
} 

请建议。提前致谢。

+4

,你会想到什么'测试()'做什么?或'Test ()'?在我看来,像你的'T'需要更多的约束... –

+2

这个代码甚至不应该编译,因为T是一个类并不意味着T是一个对象的集合,它拥有一个名为id的属性。 –

+0

嗨,Jon,'T'是一个泛型类名,我们将在调用上述方法时传递。谢谢 –

回答

4

使用像编译器通常的问题是'什么是T'的方法? 如果它只是一个类,它可以是任何东西,即使是Jon提到的StringBuilder,也不能保证它有一个属性“Id”。所以它甚至不会按照现在的方式进行编译。

为了使它的工作,我们有两个选择:

A)改变方法,让编译器知道会发生什么类型

B)使用反射和使用运行时操作(如果可能更好地避免这种情况但在使用第三方库时可能会很方便)。

A - 接口解决方案:

public interface IMyInterface 
{ 
    int Id {get; set;} 
} 

public void Test<T>(List<T> rEntity) where T : IMyInterface 
{ 
    object id = 1; 
    var result = rEntity.Where(x => x.id == id); 
} 

乙 - 反思的解决方案:

public void Test<T>(List<T> rEntity) 
{ 
    var idProp = typeof(T).GetProperty("Id"); 
    if(idProp != null) 
    { 
     object id = 1; 
     var result = rEntity.Where(x => idProp.GetValue(x).Equals(id)); 
    } 
} 
+0

中定义的类感谢Fabjan,您节省了我很多时间。反射解决方案正在为我工​​作。再次感谢。 –

1

你最定义具有id属性基本类和你的T大多数从基本类中继承。

public class BaseClass{ 
public object ID; 
} 

,你可以改变你的函数是这样的:

public void Test<T>(List<T> rEntity) where T : BaseClass 
{ 
    object id = 1; 
    var result = rEntity.Where(x => x.id == id); 
}