Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用泛型访问属性_C#_Asp.net_.net - Fatal编程技术网

C# 如何使用泛型访问属性

C# 如何使用泛型访问属性,c#,asp.net,.net,C#,Asp.net,.net,我有两个不同对象的列表,即 List<Customer> Customers; List<Retailer> Retailers; 列出客户; 列出零售商名单; 我有一个方法,如果我用适当的类型单独传递列表,一切都会正常工作 我想尝试泛型,看看我是否可以有一个方法来完成两个任务,即传入列表类型,它将遍历列表,获取记录并采取任何必要的操作 private T AddRecord<T>(List<T> ListofRecords)

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

List<Customer> Customers;
List<Retailer> Retailers;
列出客户;
列出零售商名单;
我有一个方法,如果我用适当的类型单独传递列表,一切都会正常工作

我想尝试泛型,看看我是否可以有一个方法来完成两个任务,即传入列表类型,它将遍历列表,获取记录并采取任何必要的操作

        private T AddRecord<T>(List<T> ListofRecords)
        {
            foreach (T rec in ListofRecords.Records)
            {
                Object ob = GetRecord(rec.Id);
            }
        }
private T AddRecord(记录列表)
{
foreach(记录列表中的记录)
{
对象ob=GetRecord(rec.Id);
}
}
我遇到的问题是,
rec
(foreach循环的变量)不知道它是什么类型,因此无法访问ID属性


我应该如何执行此操作?

客户
和零售
必须共享具有属性
Id
的相同基类(或实现相同接口)。然后在您的函数中:

 private T AddRecord<T>(List<T> ListofRecords) where T:YourBaseClass
        {
            foreach (T rec in ListofRecords)
            {
                Object ob = GetRecord(rec.Id);
            }
        }
private T AddRecord(记录列表),其中T:YourBaseClass
{
foreach(记录列表中的记录)
{
对象ob=GetRecord(rec.Id);
}
}

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

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

 private T AddRecord<T>(List<T> ListofRecords) where T:YourBaseClass
        {
            foreach (T rec in ListofRecords)
            {
                Object ob = GetRecord(rec.Id);
            }
        }
private T AddRecord(记录列表),其中T:YourBaseClass
{
foreach(记录列表中的记录)
{
对象ob=GetRecord(rec.Id);
}
}

使用
where T:
语句,您必须派生(或实现)基类(接口),以便编译器能够意识到
Id
属性的存在。

如果您有一个共同的祖先,您可以使用where关键字-

interface IHasId
{
    int Id { get; }
}

private T AddRecord<T>(List<T> listofRecords) where T: IHasId
{
    foreach (var rec in listofRecords)
    {
       var theId = rec.Id;
    }
    ...
}
接口IHasId
{
int Id{get;}
}
私有T AddRecord(记录列表),其中T:IHasId
{
foreach(记录列表中的var rec)
{
var theId=记录Id;
}
...
}

如果您有一个共同的祖先,可以使用where关键字-

interface IHasId
{
    int Id { get; }
}

private T AddRecord<T>(List<T> listofRecords) where T: IHasId
{
    foreach (var rec in listofRecords)
    {
       var theId = rec.Id;
    }
    ...
}
接口IHasId
{
int Id{get;}
}
私有T AddRecord(记录列表),其中T:IHasId
{
foreach(记录列表中的var rec)
{
var theId=记录Id;
}
...
}

让两个类实现包含Id属性的相同接口,并将泛型类型约束到该接口。请参阅重复,但忽略反射答案。
ListOfRecords.Records
应该是什么?您是否在某个地方有一个类具有
Records
属性?方法是让两个类实现包含Id属性的相同接口,并将泛型类型约束到该接口。请参阅重复,但忽略反射答案。
ListOfRecords.Records
应该是什么?您是否有一个类在某个地方具有
记录
属性?好的。。。这是控制台应用程序中的正常方法,所以我不能使用它,因为它没有基类?@计算机基类(或接口)是关于客户和零售商的OK。。。这是控制台应用程序中的一个普通方法,所以我不能使用它,因为它没有基类?@计算机基类(或接口)是关于客户和零售商的