我在通用列表中获取记录时遇到问题。我创建了一个通用函数,我想从任何类的类中获取记录。以下是示例代码: -从通用列表中查找项目
public void Test<T>(List<T> rEntity) where T : class
{
object id = 1;
var result = rEntity.Where(x => x.id == id);
}
请建议。提前致谢。
我在通用列表中获取记录时遇到问题。我创建了一个通用函数,我想从任何类的类中获取记录。以下是示例代码: -从通用列表中查找项目
public void Test<T>(List<T> rEntity) where T : class
{
object id = 1;
var result = rEntity.Where(x => x.id == id);
}
请建议。提前致谢。
使用像编译器通常的问题是'什么是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));
}
}
中定义的类感谢Fabjan,您节省了我很多时间。反射解决方案正在为我工作。再次感谢。 –
你最定义具有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);
}
,你会想到什么'测试()'做什么?或'Test ()'?在我看来,像你的'T'需要更多的约束... –
这个代码甚至不应该编译,因为T是一个类并不意味着T是一个对象的集合,它拥有一个名为id的属性。 –
嗨,Jon,'T'是一个泛型类名,我们将在调用上述方法时传递。谢谢 –