有人可以帮我理解这个例子中的泛型吗?

时间:2012-03-10 21:37:14

标签: c# generics

public class KI_Payments<TInfo1 ,TInfo2 , TInfo3, TInfo4, TInfo5> : KI_Leaf
{
    TInfo1 A....
    TInfo2 B.....
}

KI_Payments<TInfo1,TInfo2,TInfo3,TInfo4,TInfo5> oPayment = new KI_Payments<TInfo1,TInfo2,TInfo3,TInfo4,TInfo5>();
switch (Something)
{
     case 1:
        oPayment = new KI_Payments<string, string, string,string,string>();
     case 2:
       oPayment = new KI_Payments<string, int, int,int,int>();

}

我想要做的是取决于“Something”,我想用不同的声明声明info1-info5。
有什么想法吗? 感谢

2 个答案:

答案 0 :(得分:2)

请注意,使用不同类型参数的通用付款不会与分配兼容。你不能这样做

KI_Payment<T1,T2,T3,T4,T5> p = 
    new KI_Payment<string,int,int,int,int>(); // Does not compile!

KI_Payment<object,object,object,object,object> p = 
    new KI_Payment<string,int,int,int,int>(); // Does not compile!

相反,创建一个只有字符串属性的基类,您可以从中加载并保存到数据库。

public abstract class PaymentBase
{
    public string Info1 { get; set; }
    public string Info2 { get; set; }
    public string Info3 { get; set; }
    public string Info4 { get; set; }
    public string Info5 { get; set; }
}

然后使用专门的属性创建专门的支付类型,这些属性只是字符串属性的包装。如有必要,这些属性可以从和转换为字符串。

public class PaymentTypeX : PaymentBase
{
    public string Name
    {
        get { return Info1; }
        set { Info1 = value; }
    }

    public int Number
    {
        get {
            int n;
            Int32.TryParse(Info2, out n);
            return n; 
        }
        set { Info2 = value.ToString(); }
    }
}

最后实例化特定付款类型

PaymentBase payment;
switch (Something) { 
    case 1:         
        payment = new PaymentTypeX();
        break;
    case 2:
        payment = new PaymentTypeY();
        break;
} 

答案 1 :(得分:1)

info1是一个实例化中的信用卡号,另一个是一个支票号,你真的要在KI_Payments代码中对它们进行完全相同的处理吗?

如果您使用所需的付款类型创建类层次结构可能会更好。这样,如果您需要对其中一个TInfos进行特殊处理,则可以更好地进行代码重用。由于您的表具有字符串列,因此这将使构造函数更容易获取5个字符串参数并正确解释它们。您尚未指定Something是什么,但您可以使用类似工厂模式的内容来实现对象创建。

在一个相关的主题上,如果我们讨论的是数据库,那么拥有实际存储其他类型数据的字符串列的表可能不是一个好主意。