[编辑]与泛型参数创建实例
我再次组织我的问题,
模型参数
public class PaymentModel
{
...
}
public class CCPaymentModel : PaymentModel
{
...
}
public class PaypalPaymentModel : PaymentModel
{
...
}
public class GooglePaymentModel : PaymentModel
{
...
}
接口类
public interface IPayment<T> where T : PaymentModel
{
...
}
模型(从IPayment得到继承),
public class SagePayment
: IPayment<CreditCardPaymentInfo>
{
public void MakePayment(CreditCardPaymentInfo creditCardPaymentInfo) {
// ...
}
public void MakeRefund(CreditCardPaymentInfo creditCardPaymentInfo) {
// ...
}
}
public class GooglePayment
: IPayment<GooglePaymentModel>
{
public void MakePayment(GooglePaymentModel paymentInfo) {
// ...
}
public void MakeRefund(GooglePaymentModel paymentInfo) {
// ...
}
}
public class PaypalPayment
: IPayment<PayPalPaymentModel>
{...}
控制器(创建实例)
IPayment<???> paymentProcess; // //Error 1 Using the generic type 'com.WebUI.Models.IPayment<T>' requires 1 type arguments
if (Regex.IsMatch(paytype, "^Credit Card"))
{
paymentProcess = new SagePayment(); // it need CCPaymentModel type parameter
}
else if (Regex.IsMatch(paytype, "^PayPal"))
{
paymentProcess = new PayPalPayment(); // it need PaypalPaymentModel type parameter
}
else if (Regex.IsMatch(paytype, "^Google"))
{
paymentProcess = new GooglePayment(); // it need GooglePaymentModel type parameter
}
[EDIT]
public void Charge(string paytype,orderNo){
IPayment<???> paymentProcess; // //Error 1 Using the generic type 'com.WebUI.Models.IPayment<T>' requires 1 type arguments
Object payinfo;
if (Regex.IsMatch(paytype, "^Credit Card"))
{
paymentProcess = new SagePayment(); // <== Error, Can not casting
payinfo = getPaymentInfo(paytype, orderNo); // it return CCPaymentModel type object
}
else if (Regex.IsMatch(paytype, "^PayPal"))
{
paymentProcess = new PayPalPayment();
payinfo = getPaymentInfo(paytype, orderNo); // it return PaypalPaymentModel type object
}
else if (Regex.IsMatch(paytype, "^Google"))
{
paymentProcess = new GooglePayment(); // it return GooglePaymentModel type object
payinfo = getPaymentInfo(paytype, orderNo);
}
paymentProcess.MakePayment(payinfo);
}
[EDIT#2]
由此,
public interface IPayment {
}
public interface IPayment<T> : IPayment where T : PaymentModel
{
void MakePayment(string pickno);
void makeRefund(T refundInfo);
}
我得到一个错误,错误1“COM .WebUI.Models.IPayment'不包含'MakePayment'的定义,也没有扩展方法od'MakePayment'接受类型'Ecom.WebUI.Models.IPayment'的第一个参数可能被发现(您是否缺少使用指令或程序集引用?)
因此,为了避免该错误,我将MakePayment方法上一界面类,
public interface IPayment {
void MakePayment(string pickno);
}
public interface IPayment<T> : IPayment where T : PaymentModel
{
void makeRefund(T refundInfo);
}
现在,错误走了,但我应该如何在makeRefund情况下怎么办? 我不能移动到上层接口类,因为我需要泛型类型参数。
你能帮我多一点吗?
你想有没有泛型另一个'IPayment'接口,该'IPayment '从...继承。即:'公共接口IPayment :IPayment其中T:PaymentModel'。 –
您将需要通过反射来创建泛型类型:http://msdn.microsoft.com/en-us/library/system.type.makegenerictype.aspx。 –
你想创建一个实例? IPayment是一个界面,所以即使您遵循@ ChrisSinclair的建议,您也无法创建它的实例... – fsimonazzi