2017-05-05 3 views
1

を作成します。動的に私の問題を説明するためにここではダミーコードをジェネリックパラメータとして型自体を使用してジェネリック型

私は私をidentiftyことができない場合、私は、私のジェネリック型から型を作ることができますどのように
public class A<TX, TA> where TA : A<TX, TA> 
{ 

} 

public void Do() 
{ 
    var doy = typeof(A<,>).MakeGenericType(typeof(string), null/*??????*/)); 
} 

タイプをパラメータとして使用するには?

ありがとうございました。

編集、静的にそれをやっての例:

public abstract class A<TX, TA> where TA : A<TX, TA> 
{ 
    public TA ChainMethod() 
    { 
     return (TA)this; 
    } 
} 

public class AConcrete : A<string, AConcrete> 
{ 
    public AConcrete OtherMethod() 
    { 
    return this; 
    } 
} 

public class App 
{ 
    public static void Start() 
    { 
    new AConcrete().ChainMethod().ChainMethod().OtherMethod(); 
    } 
} 
+0

これがCRTPある場合 - 本当に醜い取得する予定です。どのようにC#でそれを表現しますか? 'A <文字列、A <文字列、A <文字列、A <文字列、........ '? –

+1

できません。しかし、「動的に」追加することは、赤ちゃんです - 静的にこれを行う方法はありません。 'A ' - どうやって "???"を展開しますか?どこかに基盤がなければならない。クラスそのものは合法ですが、それをブートストラップするために少なくとも1つの他のクラスが必要です。 [エリックリペットのコメント](https://blogs.msdn.microsoft.com/ericlippert/2011/02/03/curiouser-and-curiouser/)上でこのことに混乱し、多分あなたは関係なく、有効なままで欲しいものを達成していません。 –

+0

より高いレベルの要件について説明できますか? – Andrei

答えて

0

あなたのクラス階層を設計する必要があります。まだそこにはないようです。この例をチェックアウト、それはあなたのアイデアを与えることを願っていますしてください:

abstract class BaseBuilder<TBrick> 
{ 
    public BaseBuilder<TBrick> AddBrick(TBrick brick) 
    { 
     // ... 
     return this; 
    } 
} 

class Builder : BaseBuilder<ConcreteBrick> 
{ 
    public Builder AddRoof() 
    { 
     // ... 
     return this; 
    } 

    public new Builder AddBrick(ConcreteBrick brick) 
    { 
     base.AddBrick(brick); 
     return this; 
    } 
} 

をそして、それは次のようになります。

new Builder() 
    .AddBrick(new ConcreteBrick()) 
    .AddBrick(new ConcreteBrick()) 
    .AddRoof(); 

を私はあなた場合は、継承とチェーンコールすることはできませんだと思います私が提案したように、newキーワードでメソッドをオーバーライドしないでください。連鎖呼び出しのアイデアをあきらめれば、簡単に実装できます。

+0

サンプルに継承はありません。 – Manofgoa

+0

AddBrick()の戻り値の型がBaseBuilderであるため、AddRoof()を呼び出すことはできません。Builder: – Manofgoa

+0

@Manofgoa良い点、分かりましょう – Andrei

関連する問題