2016-11-25 10 views
2

Les'tを経由してパラメータを持つジェネリックメソッドを呼び出して、私は2つのコンストラクタ(パラメータなしのそれらとの)といくつかのクラスを持っていると言う:[]反射

public class Employee 
{ 
    private int Salary = 0; 

    public Employee() 
    { 
     Salary = 100; 
    } 

    public Employee(int newSalary) 
    { 
     Salary = newSalary; 
    } 
} 

そして、私はコンストラクタを呼び出すための一般的な方法を持っているいくつかの静的ヘルパークラスを持っている:

public static class GenericClassCreator 
{ 
    public static T CreateClassNoParams<T>() 
     where T : class, new() 
    { 
     return new T(); 
    } 

    public static T CreateClassWithParams<T>(params object[] args) 
     where T : class 
    { 
     return (T)Activator.CreateInstance(typeof(T), args); 
    } 
} 

は私が(この特定のケースでtypeof演算(従業員))を構築する必要があるクラスの種類と電話を持っていると仮定しましょうそれはthを持つコンストラクタですE次のコード(パラメータなしのコンストラクタを介して)

var method1 = typeof(GenericClassCreator).GetMethod("CreateClassNoParams"); 
var generic1 = method1.MakeGenericMethod(typeof(Employee)); 

var employee1 = generic1.Invoke(null, null); 


var method2 = typeof(GenericClassCreator).GetMethod("CreateClassWithParams"); 
var generic2 = method2.MakeGenericMethod(typeof(Employee)); 

var employee2 = generic2.Invoke(null, new object[] { (object)500 }); 

入手employee1はOKです。しかし、(パラメータを持つコンストラクタを介して)employee2を取得すると例外がスローされます。

私は

generic.Invoke(null, new object[] { (object)500 }); 

を変更しても、[]

のSystem.Objectに型可能System.Int32のオブジェクトをキャストすることができません

generic.Invoke(null, new object[] { new object() }); 

例外がスローされました

System.Objectの[]

にSystem.Object型のオブジェクトをキャストすることができません

それでは、私のコードが悪いですの?

答えて

1

お客様のメソッドは、パラメータとしてobject[]が必要です。 MethodInfo.Invokeは、すべてのパラメータを含むobject[]が必要です。これは、あなたが別のobject[]を含むobject[]が必要であることを意味します:

var employee2 = generic2.Invoke(null, new object[] { new object[] { 500 } }); 
+0

ちょうどこれをテストし、それは働いた。 –

+0

ああ.. 'object []'は別の 'object []'を含んでいます - 本当に混乱します:)。どうも。 – bairog

1

あなたがこれです混乱一部:Invokeはあなたが呼び出すメソッドのパラメータのためのオブジェクト配列を必要とします。今度はそのオブジェクト配列をとり、その中の値を使ってメソッドを呼び出します。

ただし、メソッド自体にはobject[]が必要です。今度は外側のobject[]が存在しなくなりました。メソッドを呼び出すにはintがあります。メソッドシグネチャに準拠するには、最初の配列を2番目の配列にラップする必要があります。

generic2.Invoke(null, new object[] { new object[] { (object)500 } }); 
0

この generic2.Invokeを試し(ヌル、新しいオブジェクト[] {新しいオブジェクト[] {500}})。