如何实例化,操作和返回Type T.

时间:2012-10-11 18:21:47

标签: c# generics

我有一个函数,我想使用泛型返回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'的第一个参数   可以找到(你错过了使用指令或程序集   引用?)

2 个答案:

答案 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是某个接口的成员,该接口包含CreditorNameCreditLiabilityIDBorrowerID的定义。你可以这样做:

where T: InterfaceName, new()