通用属性的通用对象的组列表

时间:2017-08-30 08:10:18

标签: c# generics

我有一个问题,我试图通过某些关键属性对通用对象列表进行分组,这些属性位于这些对象中:

    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填充,数据结构只是这些模型的通用列表

现在,如果我强烈键入模型,那么可以改变它吗?

2 个答案:

答案 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