【问题标题】:Generics C# How to pass a property of a generic object by parameter泛型C#如何通过参数传递泛型对象的属性
【发布时间】:2015-04-23 02:31:34
【问题描述】:

我已经创建了这个方法,但是它有一个我无法解决的问题。

如何通过参数传递谓词?因为“x.IsActive”和“source.Id”和“x.Id”各不相同,所以通常我将通过参数传递的所有对象都有IsActive和Id属性。

 public static Differences<T> CheckChanges<T>(List<T> sourceTable, List<T> destinationTable)
    {
        var differences = new Differences<T>();

        foreach (var sourceItem in sourceTable.Where(x => x.IsActive))
        {
            var destinationItem = destinationTable.FirstOrDefault(x => x.Id == sourceItem.Id);
        }

        return differences;
    }

【问题讨论】:

  • 那么你打算使用的类型参数是如何相关的呢?它们都是从 Account 继承的吗?
  • 不,我有不同的表,其中大多数(可能全部)我可以使用 .Id 和 .IsActive 进行过滤。所以我可以通过参数或某种通用方式传递谓词来为我的所有通用对象使用 .Id 和 .IsActive?

标签: c# generics predicate


【解决方案1】:

如果你可以让你的所有对象都从一个通用接口继承,这会容易得多:

public interface IAccount
{
    int Id { get; set; }
    bool IsActive { get; set; }
}

你的方法签名看起来更像这样:

public static Differences<IAccount> CheckChanges(List<IAccount> sourceTable, List<IAccount> destinationTable)

【讨论】:

  • 哇!我刚刚发现我所有的对象都继承了这个接口: public interface IHasId { T Id { get; } }
  • 但是,我必须通过参数传递对象 List> 而不再是 List 那么如何将我的 List 转换为 List
  • 是的,它现在可以工作了,但是我有一个实例化类 var ob = Activator.CreateInstance&lt;T&gt;(); 的代码,但这现在会产生这个错误:无法创建接口的实例。
  • 为此,请确保 T 与之前的类型相同。它应该是一个继承自你的接口的类,而不是接口本身。
  • 列表应该是var list = new List&lt;IHasId&lt;int&gt;&gt;(); 然后添加Account 对象:list.Add(new Account()); --- 或 --- list.Add(Activator.CreateInstance&lt;Account&gt;());
【解决方案2】:
public static Differences<T> CheckChanges<T>(List<T> sourceTable, 
                                             List<T> destinationTable, 
                                             Func<T, bool> predicate,
                                             Func<T, T, bool> pred2)
{
    var differences = new Differences<Account>();

    foreach (var sourceItem in sourceTable.Where(predicate))
    {
        var destinationItem = destinationTable.FirstOrDefault(x => pred2(x, sourceItem));
    }

    return differences;
}

【讨论】:

  • 示例用法和对返回结果做一些事情 (differences) 会改善答案...也可能是一些文本...
  • 酷!参数predicate和pred2有什么区别?
  • 它们用在不同的地方。一个让您发送Where 的条件,另一个用于FirstOrDefaultsourceItem 作为 T 之一
  • @AlexeiLevenkov 我现在几乎没有几分钟的时间。只是张贴引导他朝着正确的方向前进。随意编辑。
  • 很好,我只需要了解性能,因为此代码将针对我的数据库中的每条记录运行 100 万次,我怎样才能获得更好的性能?泛型比其他方法慢吗?
猜你喜欢
  • 2023-03-18
  • 1970-01-01
  • 1970-01-01
  • 2022-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多