4

我有一个函数,我想使用泛型返回 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”的定义,并且找不到接受“T”类型的第一个参数的扩展方法“CreditorName”(您是否缺少 using 指令或程序集引用?)

4

2 回答 2

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);
于 2012-10-11T18:23:15.243 回答
9

现在,您的程序只知道 T 至少是object具有无参数构造函数的 a。您需要更新您的where T以包含一个接口约束,该约束告诉您的函数 T 是某个接口的成员,该接口包含CreditorNameCreditLiabilityID和的定义BorrowerID。你可以这样做:

where T: InterfaceName, new()
于 2012-10-11T18:25:20.533 回答