如何从具有Lambda表达式的Generic类型获取Properties

pep*_*omb 0 c# generics lambda

我试图从a中过滤一些结果List<T>,但是当我尝试为列表中的元素选择属性时,这是不可能的.

这就是我调用泛型方法的方法:

var transaction = GetTransaction(transactions, idToGet);
Run Code Online (Sandbox Code Playgroud)

这是我的通用方法:

private TransactionDto GetTransaction<T>(List<T> transactions, int myId)
{
    var value = transactions.Where(x => x.Id == myId).FirstOrDefault();
    return value;
}
Run Code Online (Sandbox Code Playgroud)

由于transaction是通用参数,我无法读取Id属性,以便将其与myId参数进行比较.

如何读取所提供的通用参数的所有属性?

Mar*_*ell 5

最简单的方法是定义一些接口IHazId,使得:

interface IHazId {
    int Id {get;}
}
Run Code Online (Sandbox Code Playgroud)

并将其添加到您的类型 - 通常只添加: IHazId到每个类型; 例如:

class SomeTransaction : IHazId {...} // presumably has a public int Id
Run Code Online (Sandbox Code Playgroud)

现在将where T : IHazId约束添加到泛型方法:

private TransactionDto GetTransaction<T>(List<T> transactions, int myId)
    where T : IHazId
{...}
Run Code Online (Sandbox Code Playgroud)

你应该被设定.

不幸的是,另一种选择是:反思.


这个名字IHazId显然无关紧要; 它可能是ITransaction,或者你选择的任何东西.