我有一个问题,我试图通过某些关键属性对通用对象列表进行分组,这些属性位于这些对象中:
public void GroupChanges<TResult>(List<TResult> changes)
{
const string KeyPropertyName = "TransactionSequence";
List<IGrouping<byte[], TResult>> changeSet = changes
.GroupBy(change => /*change.TransactionSequence */ <- property avaible in every object that is
change.GetType().GetProperty(KeyPropertyName).GetValue(change)
, new ArrayComparer<byte>())
.ToList();
}
数据和模型的模型相当简单我有一个抽象的泛型模型,其中包含Key属性,模型继承该属性,数据从Db填充,数据结构只是这些模型的通用列表
现在,如果我强烈键入模型,那么可以改变它吗?
答案 0 :(得分:3)
您需要声明一个接口,该接口由您传递给该方法的所有类型实现。并将其作为类型约束添加到您的方法中。您可以访问界面的属性。
interface ICommon
{
byte[] TransactionSequence { get; set; }
}
public void GroupChanges<TResult>(List<TResult> changes)
where TResult: ICommon
{
List<IGrouping<byte[], TResult>> changeSet = changes
.GroupBy(change => change.TransactionSequence , new ArrayComparer<byte>())
.ToList();
}
注意:类型约束也适用于抽象/基类。如果使用EF
进行LINQ over IQueryable,这将不起作用答案 1 :(得分:2)
好的,如果您的函数是通用的,那么它如何知道TResult
是否具有"TransactionSequence"
属性?它无法知道这一点并且是通用的。除非你对类型see Titian's answer设置约束,否则这会使函数不那么通用,但这可能很有用。
您需要提出Func<TResult, TProperty>
之类的代表,但您也可以直接致电GroupBy
。