8

与えられた:

class BaseClass {}
class DerivedClass : BaseClass {}

BaseClass パラメーターを持つアクションを受け入れることができる関数を作成したいと考えています。この関数は、指定されたタイプのオブジェクトを作成し、それを Action に渡します。

void MyFunction(Type type, Action<BaseClass> DoAction)
{
  BaseClass obj = (BaseClass)Activator.CreateInstance(type); 
  DoAction(obj);
}

パラメータがDerivedClassであるAnotherFunctionを渡したい:

void AnotherFunction(DerivedClass x)
{
}

MyFunction を呼び出すにはどうすればよいですか? 以下は、AnotherFunction 引数のために無効です。

MyFunction(typeof(DerivedClass), AnotherFunction);
4

1 に答える 1

13

可能であれば、代わりにジェネリックを使用してみてください。

void MyFunction<T>(Action<T> DoAction) where T : BaseClass, new()
{
    DoAction(new T());
}

次に、次のように書くことができます。

MyFunction<DerivedClass>(AnotherFunction);

この意志:

  • コンパイル時のチェックを行って、使用するBaseClass型またはその派生型であることを確認します。型が拡張されないため、実行時エラーは発生しませんBaseClass
  • 存在しない場合に実行時に例外をスローするのではなく、型にパラメーターなしのコンストラクターがあることを確認するためにコンパイル時のチェックを行います。
  • Action型が適切でない場合に実行時に例外をスローするのではなく、 に提供されたメソッドが使用される型に適したパラメーターを受け入れることを確認するために、コンパイル時のチェックを行います。
于 2013-05-03T19:35:35.377 に答える