具有多个泛型参数的C#方法

3
我正在尝试构建一个通用的方法和四个实现了 IDetail 接口的类。每个类都有一组实现了 ITaxes 接口的类的集合。我希望构建一个通用方法,能够让我访问每个类的集合。
类似于这样:
public void UpdateCollection<T,I>(T Detail,Taxes TaxesList ) where T:IDetail where I:Itaxes
{
   foreach( Taxes  tax in TaxesList)
   {
       Detail.I.Add(tax);
   } 
} 

我想访问类型为I的属性,它属于类型T。我该怎么做?这可行吗? 我需要为每个类编写一个方法吗?


2
您可以使用反射。 - SLaks
1
“type I” 属性是什么意思?可能有多个这样的属性,也可能没有...您可以使用反射查找所有这些属性,但在我看来这将是一个非常奇怪的方法。 - Jon Skeet
2
IDetail 是否实现了 I 属性? - Harrison
2
这是通常情况,不良的数据模型会导致各种复杂的问题。 - Federico Berasategui
1
你能解释一下在这里使用泛型的目的吗?使用多态和接口的常规用法是否足够?即,如果所有IDetails都有一个在接口中定义的Itaxes属性,则泛型可能不是解决方案。 - George Powell
显示剩余4条评论
2个回答

6
理想情况下,您应该修改您的IDetail接口,将ITaxes对象列表作为该接口的一部分包括在内。如果您想让公开暴露的命名属性在每个细节中具有不同的名称,您可以使用显式接口实现。

如果这不可能,或者因其他原因没有意义,那么您最好的选择可能是使此方法接受一个Func<T, I>参数。用户随后可以提供一种方法,允许您从每个T对象中提取所需的列表。

public void UpdateCollection<T, I>(T Detail, Taxes TaxesList, Func<T, I> taxSelector)
    where T : IDetail
    where I : Itaxes
{
    I taxList = taxSelector(Detail);
    foreach (Taxes tax in TaxesList)
    {
        taxList.Add(tax);
    }
}

调用者可以使用Lambda为该对象定义适当的属性。

我对“Func”没有太多的经验,请问您能否给我一些关于使用“Func<T, I> taxSelector”的指导?非常感谢您的帮助。 - Juan Pablo Gomez
它是一个委托。它代表一个接受类型为T的单个参数并返回类型为I的对象的函数。 - Servy
@Srvy,非常感谢你的帮助。 - Juan Pablo Gomez

0
创建第三个接口,公开您所寻找的共性。在部分类(如果已生成)中订阅该接口,然后在通用方法中仅接受该接口并相应地处理。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接