有人可以帮助我理解此示例的泛型吗?

本文关键字:泛型 帮助 | 更新日期: 2023-09-27 18:27:34

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>();
}

我想做的是取决于"某物",我想用不同的声明声明 info1-info5。
有什么想法吗?谢谢

有人可以帮助我理解此示例的泛型吗?

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

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;
} 

假设info1在一个实例化中是信用卡号,在另一个实例中是支票号,您实际上打算在KI_Payments代码中将它们完全相同吗?

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

在相关主题上,拥有带有字符串列的表,您可以在其中实际存储其他类型的数据,这可以说不是一个好主意,尤其是当我们谈论数据库时。