从通用列表中获取记录时遇到问题。我创建了一个通用函数,我希望从任何类型的类中获取记录。以下是示例代码: -
public void Test<T>(List<T> rEntity) where T : class
{
object id = 1;
var result = rEntity.Where(x => x.id == id);
}
请建议。提前谢谢。
答案 0 :(得分: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);
}
B - 反思解决方案:
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));
}
}
答案 1 :(得分: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);
}