0

一般的な拡張メソッド (AsXml など) を作成しましたが、一部のクラスでインターフェイス (IXmlable) による制約が必要です。

制約を導入するとすぐに、いくつかのメソッドが私と議論しています。

私の方法の1つは a を返すことでList<Interest>あり、コンパイラは次のように言います:

型 'System.Collections.Generic.List' は、ジェネリック型またはメソッド 'MyWebApp.Entities.Extension.AsXml(T)' の型パラメーター 'T' として使用できません。「System.Collections.Generic.List」から「MyWebApp.Interfaces.IXmlable」への暗黙的な参照変換はありません。

これは私のクラスです:

public class Person : IXmlable
{
   public string Name { get; set; }
   public List<Interest> Interests { get; set; } // My Interest class also implements IXmlable
} 

私の拡張メソッドは次のようになります。

 public static class Extension
    {
        public static string AsXml<T>(this T entity) where T : IXmlable
        {
             return MakeItXml(entity);
        }
    }

この私の方法:

return MyMethodThatReturnsAListOfPersons().AsXml();
4

1 に答える 1

1

次のようなことをする必要があります

return MyMethodThatReturnsAListOfPersons().Select(p => p.AsXml()).ToList();

MyMethodThatReturnsAListOfPersonsが a を返し、それを含む xmlをList<Person>作成したいとします。List<string>

これは、がインターフェイスをList<T>実装していないためです。そのため、リスト内の各要素IXmlableに対して手動で射影を行う必要があります。Person

これを頻繁に行う必要がある場合は、別の拡張メソッドを作成できます。

public static List<string> AsXmlList<T>(this IEnumerable<T> seq) where T : IXmlable
{
    return seq.Select(i => i.AsXml()).ToList();
}

したがって、コードは次のようになります。

return MyMethodThatReturnsAListOfPersons().AsXmlList();
于 2013-05-18T14:10:49.033 に答える