【问题标题】:How to use Generics to access property [duplicate]如何使用泛型访问属性[重复]
【发布时间】:2019-09-20 15:54:05
【问题描述】:

我有两个不同对象的列表,即

List<Customer> Customers;
List<Retailer> Retailers;

我有一个方法,如果我分别传入具有适当类型的列表,一切正常。

我想尝试泛型,看看我是否可以有一种方法来完成两项任务,即传入 List 的类型,它会遍历列表并获取记录并采取任何必要的行动。

        private T AddRecord<T>(List<T> ListofRecords)
        {
            foreach (T rec in ListofRecords.Records)
            {
                Object ob = GetRecord(rec.Id);
            }
        }

我遇到的问题是recforeach 循环的变量)不知道它是什么类型,所以我无法访问 ID 属性。

我该怎么做?

【问题讨论】:

  • 通过让两个类实现包含 Id 属性的相同接口,并将您的泛型类型约束到该接口。查看重复但忽略反射答案。
  • ListOfRecords.Records 应该是什么?你在某处有一个有Records 属性的类吗?

标签: c# asp.net .net


【解决方案1】:

CustomerRetail 必须共享具有Id 属性的相同基类(或实现相同接口)。然后在你的函数中:

 private T AddRecord<T>(List<T> ListofRecords) where T:YourBaseClass
        {
            foreach (T rec in ListofRecords)
            {
                Object ob = GetRecord(rec.Id);
            }
        }

where T: 声明 T 必须派生(或实现)您的基类(接口),以便编译器知道Id 属性的存在。

【讨论】:

  • 好的...所以这是控制台应用程序中的普通方法,所以我不能使用它,因为它没有基类?
  • @Computer 基类(或接口)是关于客户和零售商的
【解决方案2】:

如果你有一个共同的祖先,你可以使用 where 关键字将 T 限制为那个 -

interface IHasId
{
    int Id { get; }
}

private T AddRecord<T>(List<T> listofRecords) where T: IHasId
{
    foreach (var rec in listofRecords)
    {
       var theId = rec.Id;
    }
    ...
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-03
    • 1970-01-01
    • 2023-03-18
    • 2015-12-06
    相关资源
    最近更新 更多