4

ジェネリックを使用して CreditSupplementTradeline または CreditTradeline を返したい関数があります。問題は、 T ctl = new T(); を作成すると ... VS2010 はそのプロパティを認識しないため、ctl を操作できません。これはできますか?ありがとうございました。

    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()

2 つのクラスでインターフェイスを実装する必要があります。

class CreditTradeline  : ICreditTradeline
{
     // etc...
}

class CreditSupplementTradeline  : ICreditTradeline
{
     // etc...
}

次に、クラスを型パラメーターとしてメソッドを呼び出すことができます。

CreditTradeline result = this.GetCreditTradeLine<CreditTradeline>(xElement, s);
于 2012-10-11T18:23:15.243 に答える
9

現在、あなたのプログラムは、 T が少なくともobjectパラメーターのないコンストラクターを持つ であることを知っているだけです。を更新して、 T が、、およびwhere Tの定義を含む何らかのインターフェースのメンバーであることを関数に伝えるインターフェース制約を含める必要があります。これは次のように行うことができます。CreditorNameCreditLiabilityIDBorrowerID

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