2009-05-20 14 views
8

次のような関数をコードしたいと思います。 C#:メソッドパラメータの型を制限する(汎用パラメータではない)

public void Foo(System.Type t where t : MyClass) 
{ ... } 

言い換えれば、引数の型はSystem.Typeです。許容されるTypeMyClassから派生するものに制限します。

これを構文的に指定する方法はありますか、または実行時にtをチェックする必要がありますか?

+0

あなたのアプローチが間違っている可能性があります。私がこれを見ると、MyClassにインスタンスメソッドFoo()を作成するほうがずっと簡単です。すべての派生クラスがFooを呼び出すことができ、this.GetType()を使用して追加の健全性チェックなしで同じ動作を実行できます。 – Juliet

+0

私はリフレクション機能のためにこれをやっています - 関数内では、型のプロパティにアクセスする必要があります。 – kpozin

答えて

9

あなたのメソッドが引数としてType型を取らなければならない場合、これを行う方法はないと思います。メソッド呼び出しに柔軟性がある場合は、public void Foo(MyClass myClass)を呼び出し、.GetType()を呼び出してTypeを取得します。

少し拡大します。 System.Typeは引数の型であるため、渡すべきものをさらに指定する方法はありません。 1と10の間の整数を取るメソッドと同じように、intをとり、制限が正しく守られているかどうかをランタイムチェックする必要があります。

0

なぜあなたは代わりに

public void foo<t>(); 

使用していませんか?

1

理論的には、属性を使って何ができますか。しかし、これは非常に明確である(IMO)とまったく同じことん:

public void Foo(MyClass m) { 
    Type t = m.GetType(); 
    // ... 
} 
+0

もちろん、nullの場合は動作しません。 :) –

2

次を使用することができます。

public void Foo<T>(T variable) where T : MyClass 
{ ... } 

呼び出しは次のようになります:

{ 
    ... 
    Foo(someInstanceOfMyClass); 
    ... 
} 
+0

これは、OPが尋ねたものではありません。 –

3

タイプをMyClassに指定するか、またはそれから派生した場合、は引数そのものの値チェックです。 helloパラメータを

void Foo(int hello) {...} 

に10から100の間で指定する必要があります。コンパイル時にはチェックすることはできません。

他のパラメータ値チェックと同様に、実行時にジェネリックを使用するか、タイプをチェックする必要があります。

ます。また、MyClassのに変換するすべてのオブジェクトのために利用できるようになります拡張メソッド、使用することができます
0

public static class MyClassExtensions 
{ 
    public static void Foo(this MyClass obj) 
    { 
     // ... 
    } 
} 

をそして、それは、オブジェクトの一般的な方法であるかのようにあなたがそれを使用することができます。

var x = new MyClass(); 
x.Foo(); 
関連する問題