我有一个函数,我想使用泛型返回CreditSupplementTradeline或CreditTradeline。问题是,如果我创建一个T ctl = new T(); ...我无法对ctl进行操作,因为VS2010无法识别其任何属性。可以这样做吗?谢谢。
internal T GetCreditTradeLine<T>(XElement liability, string creditReportID) where T: new()
{
T ctl = new T();
ctl.CreditorName = this.GetAttributeValue(liability.Element("_CREDITOR"), "_Name");
ctl.CreditLiabilityID = this.GetAttributeValue(liability, "CreditLiabilityID");
ctl.BorrowerID = this.GetAttributeValue(liability, "BorrowerID");
return ctl;
}
我收到此错误:
错误8'T'不包含'CreditorName'的定义,不包含 扩展方法'CreditorName'接受类型'T'的第一个参数 可以找到(你错过了使用指令或程序集 引用?)
答案 0 :(得分:14)
您需要具有适当属性的界面,例如:
internal interface ICreditTradeline
{
string CreditorName { get; set; }
string CreditLiabilityID { get; set; }
string BorrowerID { get; set; }
}
在您的方法上,您需要向T
添加一个约束,要求它必须实现上述接口:
where T: ICreditTradeline, new()
您的两个类应该实现接口:
class CreditTradeline : ICreditTradeline
{
// etc...
}
class CreditSupplementTradeline : ICreditTradeline
{
// etc...
}
然后,您可以使用类作为类型参数调用该方法:
CreditTradeline result = this.GetCreditTradeLine<CreditTradeline>(xElement, s);
答案 1 :(得分:9)
现在,您的程序只知道T至少是object
,它具有无参数构造函数。您需要更新where T
以包含一个接口约束,该约束告诉您的函数T是某个接口的成员,该接口包含CreditorName
,CreditLiabilityID
和BorrowerID
的定义。你可以这样做:
where T: InterfaceName, new()