从通用列表中查找项目
Find item from generic list
我在从通用列表中获取记录时遇到问题。我创建了一个通用函数,我想从中获取任何类型 class 的记录。下面是示例代码:-
public void Test<T>(List<T> rEntity) where T : class
{
object id = 1;
var result = rEntity.Where(x => x.id == id);
}
求推荐。提前致谢。
使用这样的方法,编译器的一个常见问题是 'what is T'?
如果它只是一个 class,它可以是任何东西,甚至是 Jon 提到的 StringBuilder
,并且不能保证它有一个 属性 'Id'。所以它甚至不会像现在这样编译。
要让它发挥作用,我们有两个选择:
A) 更改方法并让编译器知道期望的类型
B) 使用反射并使用 运行-time 操作(最好尽可能避免这种情况,但在使用 3rd 方库时可能会派上用场)。
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));
}
}
您最定义了一个具有 id 属性 的基本 class,并且您的 T 最继承自该基本 class。
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);
}
我在从通用列表中获取记录时遇到问题。我创建了一个通用函数,我想从中获取任何类型 class 的记录。下面是示例代码:-
public void Test<T>(List<T> rEntity) where T : class
{
object id = 1;
var result = rEntity.Where(x => x.id == id);
}
求推荐。提前致谢。
使用这样的方法,编译器的一个常见问题是 'what is T'?
如果它只是一个 class,它可以是任何东西,甚至是 Jon 提到的 StringBuilder
,并且不能保证它有一个 属性 'Id'。所以它甚至不会像现在这样编译。
要让它发挥作用,我们有两个选择:
A) 更改方法并让编译器知道期望的类型
B) 使用反射并使用 运行-time 操作(最好尽可能避免这种情况,但在使用 3rd 方库时可能会派上用场)。
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));
}
}
您最定义了一个具有 id 属性 的基本 class,并且您的 T 最继承自该基本 class。
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);
}