2012-03-07 20 views
0

これは他の構文で可能ですか?ジェネリック型引数を持つ汎用のジェネリック型

interface IFoo<T<U>> where U: Bar, new() where T<U>: class, IFoo<T<U>>, new() 

それはいくつかのポイントを説明するためにジェネリック型

class MyFoo<U>: IFoo<MyFoo<U>> where U: Bar, new() 

編集することがIFooのための一般的な引数を強制する方法です:

  • Uはバーで...それを考え
  • TはIFoo ...カスタマービジネスオブジェクトになります
  • IFooはインターファーです私は現在、それを実装することができますが、私は一般的なU.

    はそれなしで生きることができる失う

    interface IFoo<T<U>> where U: Bar, new() where T<U>: class, IFoo<T<U>>, new() 
        T<U> DoOnce(); 
    
    class MyFoo<U>: IFoo<MyFoo<U>> where U: Bar, new() 
        MyFoo<U> DoOnce(){return this;} 
        MyFoo<U> DoAgain(){return this;}//this is not in interface 
    
    class Test{ 
        public Test(){ 
         IFoo<MyFoo<Bar>> x = new MyFoo<Bar>();//Generics can come as parameters 
         x. 
          DoOnce()//this is from interface 
          DoAgain();//Can access this x's method cause of generic in IFoo 
        } 
    } 
    

    ??:いくつかのビジネスのためのCEは

  • オブジェクトIFooは、使いやすさを説明するために編集List<U> GetList(int compareToCustomerProperty)

を定義します?完全に
私のコードのいくつかの時点でこのアプローチを逃すだろうか???ナ!

は、私はちょうど私が、これは(抽象&コンクリートの間でメソッドチェーンジェネリックで、より自由)私のコードで答えを

感謝を持っていいだろう見た地点に来ました!

+0

なぜ 'IFoo'がどのように' U'が制約されている気にする必要がありtypeof(T).IsGenericTypeを呼び出すことにより、一般的なものであれば、あなたは常に実行時にチェックすることができるということが必要な場合は?ユースケースは何ですか? –

+0

こんにちは@Babcockは編集の第4ポイントで答えました –

+0

しかし、 'IFoo'は' U'を 'T 'にインスタンス化する責任を委任すべきではありませんか? –

答えて

1

私はあなたがやろうとしていると思うものに近づく唯一のものは

public interface IBaz<U> 
{ 
} 

public class Baz<U> : IBaz<U> 
{ 
} 

public interface IFoo<T, U> where T : IBaz<U> where U: Bar, new() 
{ 
}  

public class Foo<U> : IFoo<Baz<U>, U> 
    where U: Bar, new() 
{ 
} 
+0

こんにちは@ user375487 IFooとTの関係を見てください –

+0

はい、私はそれを見ました。あなたが書いたものは、ほとんど不可能です。制限付き引数を参照することで制約を指定することはできず、宣言した型への参照を持つインタフェースを実装することはできません。 –

+0

私は見る...ありがとう@ user375487 –

1

ありません、あなたが行うことはできません.NET Frameworkのこと。

ジェネリック型の引数をジェネリックそのものに制限することは意味がありません。次の型を考えてみましょう:

public class StringList : List<string> { } 

StringListList<string>はほとんど同じタイプです。しかし、あなたは

Foo<List<string>> 

、あなたが作業しているではない

Foo<StringList> 

List<string>は、ジェネリック型定義List<>から作成されたという事実は、使用のほとんどに実際に関連していない場合を除きを書くことができるだろうハイフライのようなもの反射的な振る舞い。

私はあなたがこのような何かをやってみたかった場合は、機能のこの種をすることができ、インスタンスを参照することができます

:あなたはT<U>からT<V>に変換する関数を宣言するコンバータインタフェースを作成したい場合は

public interface GenericTypeConverter<T> where T : <> 
{ 
    T<V> Convert<U,V>(T<U> thing); 
} 

任意のジェネリックタイプTに対してしかし、複雑なコード生成/コード解析に取り組んでいれば、これが起きるとしか想像できません。

そして、それはケースだとあなたが本当にタイプT

+0

ありがとう@ d-b私はちょうど私がやろうとしていたの例を書いた –