インターフェイスIinterface
を実装するすべてのクラスの拡張メソッドを作成しようとしています。T
のリストを返します。T
は元のクラスです。だから、基本的には何か:インターフェイスを実装するクラスの拡張メソッド
public static List<T> Funct<T>(this T obj)
where T : Iinterface, new()
しかしこれだけではなくIinterface
クラスに、すべてのオブジェクトに適用されます。だから、this Iinterface obj
のようなものを作ろうとしていますが、それはmyObj.Funct<MyObjType>()
として使用する場合にのみ使用します。List<MyObjType> list = myObj.Funct()
として直接使用することはできません。このような拡張機能の使用方法はありますか?
私はユーティリティ関数を使用して検討するか、次のようなものを作成するためにIinterface
を拡張しています:そして、私はこのような拡張機能を作ることができます
interface IExtend<T> : Iinterface
where T : IExtend<T> {}
を:私はこれを行う前に、しかし
public static List<T> Funct<T>(this IExtend<T> obj)
where T : IExtend<T> {}
、 Iinterface
オブジェクトに直接関数を実装する方法はありますか?
更新 使用例:
public interface Iinterface { }
public interface Iinterface2 { }
public class MyObjType : Iinterface { }
public class SomeOtherClass : Iinterface2 { }
public static class Mine {
public static List<T> Funct<T>(this T obj)
where T : Iinterface, new() => null;
public static void Funct(this Iinterface2 obj)
{ }
public static void Main()
{
MyObjType obj = new MyObjType();
List<MyObjType> list = obj.Funct(); // the above mentioned function works in this case
SomeOtherClass obj2 = new SomeOtherClass();
obj2.Funct(); // uses the wrong extension function
}
}
アップデート2
私は使い方が異なるいくつかの回答や提案に気づきました。だから明確にする:
私は、出力を得ることができる別の構造を使用することを理解しています。私もすでに持っています。しかし、私は、この特定の使い方のために働くことができる構造を持つ方法があるかどうかを探していました。主な理由はこれが私が見つけた最も単純な使い方であり、私の主な目的はこの機能を最も簡単な方法で実装することです。 基本的には、正確な使用法を、obj.Funct()
とobj2.Funct()
として渡す必要があるジェネリックまたはパラメータなしで探しています。
編集あなたの質問:
は、このようにそれを消費このエクステンションメソッドをどのように使用するか、それが表示されるが、それを望まない状況をビジュアルスタジオにコピーして貼り付けることができる完全な例を示してください。あなたの例では 'var'を使わないでください。 –
ポイントを獲得しました。ありがとう –
あなたの問題は拡張メソッドに固有の問題ではありません。関数のオーバーロード解決は全く同じように動作しますが、完全一致は汎用タイプ一致よりも「良い」一致とみなされます。 –