2017-12-07 29 views
1

インターフェイス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()として渡す必要があるジェネリックまたはパラメータなしで探しています。

+3

編集あなたの質問:

public static List<Iinterface> Funct(this Iinterface obj) { var list = new List<Iinterface>(); //Add your logic here. return list; } 

は、このようにそれを消費このエクステンションメソッドをどのように使用するか、それが表示されるが、それを望まない状況をビジュアルスタジオにコピーして貼り付けることができる完全な例を示してください。あなたの例では 'var'を使わないでください。 –

+0

ポイントを獲得しました。ありがとう –

+1

あなたの問題は拡張メソッドに固有の問題ではありません。関数のオーバーロード解決は全く同じように動作しますが、完全一致は汎用タイプ一致よりも「良い」一致とみなされます。 –

答えて

0

ない最善のことができますが、このような何か行うことができます。これらの第2のパラメータは、あなたのコンパイラを助けるためにちょうどここにある

public static List<T> Funct<T>(this T obj, Iinterface type) 
    where T : Iinterface, new() 

public static void Funct(this Iinterface2 obj, Iinterface2 type) 

を。 しかし、パラメータとしてオブジェクトの2倍を渡す必要があり、面倒です。

public static void Main() 
{ 
    MyObjType obj = new MyObjType(); 
    List<MyObjType> list = obj.Funct(obj); // still works as expected 

    SomeOtherClass obj2 = new SomeOtherClass(); 
    obj2.Funct(obj2); // uses the correct one, now 
} 

しかし、最善の解決策のIMHO、あなたの拡張機能の名前を変更することです。

リストを返すメソッドとそうでないメソッドを返す。彼らは明らかに同じ仕事をしません。

なぜ、これらの名前はまったく同じ名前ですか?

+0

あなたの答えをありがとう。しかし、もし私がどちらかの方法で関数のパラメータを言及しているとすれば、それはもっと安全だと考えて、ジェネリック(私の質問で言及された方法)を言及するかもしれません。 –

+0

メソッド名に関して、それらは同じ仕事を行い、どちらもリストを返します。私は本当にコードを簡素化しました。なぜなら、それは普及していて、共有するのが本当に巨大だったからです。 –

+0

@NevilleNazerane - 「コードが単純化されたので、コードを単純化しました。共有するのに非常に巨大でした」 - あなたが問題を実証するために最小限のコードを提供していない場合は、より多くのコードを表示する必要があります。あなたは[mcve]が必要です。 – Enigmativity

0

のインターフェイスを使用する方法について全体のポイントは、あなたの代わりにこのような何かを行うことを検討する必要がありますので、実装の詳細を隠すことである。

MyObjType obj = new MyObjType(); 
List<Iinterface> list = obj.Funct(); 
+0

元のタイプへの参照が必要でした。型の新しいオブジェクトを作成する必要もあります。それで 'new()'のようになります。 –

+0

@NevilleNazerane:より完全な例を提供してください。 – JuanR

+0

が更新プログラム2で質問を更新しました –

関連する問題