2017-11-27 18 views
1

私はいくつかのTypeを受け入れるコンストラクタを作成しようとしていますが、それらのすべてではありません。C#でTypeに代入可能なコンストラクタパラメータを宣言する

現在:まで私が欲しい

public MyClass(Type type) 
{ 
    this.Type = type; 
} 

:もちろん

public MyClass(typeof(IMyInterface) type) 
{ 
    this.Type = type; 
} 

、それがコンパイルされません。

C#でこれを達成する方法はありますか?

+0

'type'が正しいインタフェースを実装していることを確認してランタイム例外をスローすることができますが、なぜこれを最初にやりたいのですか?これはXY問題のようです。 – DavidG

+0

一般的にジェネリックを使用するように切り替えることを示すパラメータを入力したい場合。しかし、一般的なコンストラクタだけを持つことはできません。 –

+0

これはおそらくX/Yの質問です。もしあなたがこれを必要としていると述べたなら、助けになります。 –

答えて

2

いいえ、ダイナミックなfiこのようなことが起こります。必要に応じてインスタンスを提供することができます。そこでは、インターフェイスを型名として使用できます。

例外をスローするか、ジェネリックを使用して特定のタイプのみが提供されるようにすることができます。インスタンスから

public MyClass(IMyInterface instance) 
{ 
    this.Type = instance.GetType(); 
} 

例外:

public MyClass(Type type) 
{ 
    if (!(typeof(IMyInterface).IsAssignableFrom(type))) 
     throw new ArgumentException(); 

    this.Type = type; 
} 

ジェネリックは、他の回答に示されています。

2

あなたはジェネリッククラスをしたい、型コンストラクタをしたくない:

var sample = new MyClass<OtherClass>(); 

public class MyClass<T> where T: IMyInterface 
{ 
} 

今、あなたは、そのインターフェイスを実装する任意の他のタイプと、このクラスを初期化することができます

public class OtherClass : IMyInterface 
{ 
} 
+0

あなたは正しいと思います。ちょうど私がしようとしていることをすることが可能かどうかを確かめたかったのです。 – ferit

1
public MyClass<T> where T : IMyInterface 
{ 
    public MyClass() 
    { 
     this.Type = typeof(T); // not that you still need it 
    } 
} 
関連する問題