2

何かがクラス変数によって定義されているので、どうすれば変数の型をメソッドパラメーターに入れることができますか?例えば:

class MyClass {
   private Type _type;

   public MyClass(Type type) {
      _type = type;
   }

   public void SomeMethod(_type param) { //... }
   public _type OtherMethod() {}

}

つまり、動的型をクラス内の変数に設定し、そのType変数を他のオブジェクトの型として使用できるという考え方です。

C#でこれを行うことは可能ですか?

編集:

私は自分の質問をより明確にし、なぜそのような機能を求めているのかを説明することにしました。Genericsを試しました。ただし、ジェネリックスの問題は、次のようなクラスのオブジェクトを参照するたびに、クラスの型を宣言する必要があることです。MyClass<TSomeType> param

私のシナリオでは、List<MyClass> dataListを含むがありますMyClass。MyClassにジェネリックがある場合、dataListはである必要がありますList<MyClass<TSomeType>>。この場合、リストは。のみで構成できるため、スタックしますMyClass<TSomeType>。クラス全体の型を宣言すると、他の種類の型を持つことはできません。これが、クラスの型を変数に格納し、この変数をクラス型のように使用できるように、型を宣言するより動的な方法があるかどうかを知りたい理由です。

4

2 に答える 2

5

C#でこれを行うことは可能ですか?

いいえ。コンパイラは?で何をしMyClassますか?メソッド呼び出しが有効かどうかを知ることはできなかったでしょう。

ただし、代わりにジェネリックを使用できます。

class MyClass<T>
{
    public void SomeMethod(T param) { ... }
    public T OtherMethod() { ... }
}

この時点で、コンパイラーはMyClass<string>それを見ると、それSomeMethod("foo")が有効であることを認識しますが、そうでSomeMethod(10)はありません。

実行時までタイプが本当にわからない場合は、次を使用することをお勧めしますobject

class MyClass
{
    public void SomeMethod(object param) { ... }
    public object OtherMethod() { ... }
}

Type...そして、本当に必要な場合は、実行時チェックを実行する可能性があります。

于 2012-10-25T14:49:00.490 に答える
2

ここで探しているのはジェネリックスだと思います-これにより、あなたが求めているものに加えて、コンパイル時の型安全性の利点が得られます。

public MyClass<T>
{
    public void SomeMethod(T param)
    {
        ...
    }

    public T OtherMethod()
    {
        ...
    }
}

使用法

var intClass = new MyClass<int>();
intClass.SomeMethod("10"); // would cause a compile error
intClass.SomeMethod(10); // would compile ok
string result = intClass.OtherMethod(); // would cause a compile error    
int result = intClass.OtherMethod(); // would compile ok
于 2012-10-25T14:48:56.890 に答える