有人可以帮我理解这个例子的泛型吗?
问题描述:
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
是什么,但您可以使用类似Factory模式的内容来实现对象创建。
关于相关主题,如果我们正在谈论数据库,那么在表中实际存储其他类型的数据的表中包含字符串列的情况并不是一个好主意。
您需要提供更多的上下文。我们不知道你的变量声明在哪里。一个简短但完整的例子(理想情况下使用较少的类型参数)将会很有用。 – 2012-03-10 21:39:09
如果您发现自己使用多于一个的参数化泛型,让我们说3种类型,请停下来思考如果您做错了什么。 – 2012-03-10 21:40:39
您能否详细说明“用不同声明声明info1-info5”? – Tung 2012-03-10 21:40:47