0

重複の可能性:
リフレクションを使用してジェネリック メソッドを呼び出す方法は?

以下のシグネチャを持つメソッドがあります

public string Register<T>()
{
  //code
}

このように呼び出すことができます

var result = Register<Employee>();

私の要件は、構成ファイルからタイプ T を読み取ってメソッドを呼び出すことです。

つまり 、「従業員」をハードコーディングする代わりに、呼び出し中に、構成ファイルを読み取って動的に提供できるはずです。

それを行う方法について何か考えはありますか?

4

3 に答える 3

2

リフレクション、具体的にはMakeGenericMethodを使用できますが、コンパイル時に型がない場合は、メソッドのシグネチャを に変更することをお勧めしますRegister(Type type)。次に、構成ファイルからタイプを読み取り、直接渡すことができます。

編集

への参照を追加するとSimpleInjector.Extensions、一般的でない登録方法にアクセスできるようになります。こちらのソースのNonGenericRegistrationsExtensions.csを参照してください。これにより、次のようなことができます。

string typeName = GetTypeNameFromConfigFile();
Type type = Type.GetType(typeName);
container.RegisterSingle(type, type); // register as self

その後、ジェネリックはまったく必要ありません。

また、高度なシナリオを読みたいと思うかもしれません

于 2012-09-18T21:40:40.360 に答える
1

コンパイル時に型パラメーターが必要になるため、これを行うには、リフレクションを使用する必要があります。

リフレクションを使用してジェネリックメソッドを呼び出すにはどうすればよいですか?

于 2012-09-18T21:37:41.023 に答える
0

web.config で

<appSettings>
<!-- The assembly name of the default type. Use the format Fully.Qualified.Class.Name, Assembly.FileName -->
<add key="DefaultType" value="MyTestApp.BusinessEntitites.Employee, MyTestApp.BusinessEntitites " />
</appSettings>

C# の場合:

static void Main(string[] args)
{
    Type obj = Type.GetType(ConfigurationManager.AppSettings["DefaultType"]);
    ConstructorInfo constructor = obj.GetConstructor(new Type[] { });
    var myinstance = constructor.Invoke(null);
    var result = Register<myinstance>();
}
于 2012-09-18T21:42:44.843 に答える