0

リフレクションに問題があります。基本的に、次のように Class のメソッドを呼び出す必要があります。

public Int32 addNumer (Int32 a, Int32 b)
{
    return (a+b);
}

そして、「外部」C#ソフトウェアからこの入力を受け取り、呼び出す必要がある魔女のメソッドを評価する必要があるため、リフレクションで呼び出す必要があります。

問題は、入力として「プロンプトコマンドライン」によって渡された2つのオブジェクトがあるため、バイトに変換したことです。

Byte a = 10;
Byte b = 10;

そのため、Refection を実行すると、入力に 2 バイトのメソッドが見つからなかったため、「メソッド addNumber が見つかりません」というエラーが表示されます。2 Byte ではなく 2 Int32 が必要だったと思います。

どうすれば解決できますか?

D.

更新 1:

Object result_object = target_class.InvokeMember(method, 
                           BindingFlags.InvokeMethod, null, target_object, 
                           args_values, null, null, args_names);

更新 2: EXE ファイルからこの呼び出しを受け取るため、Int32 にキャストできません。

MyProjectPrompt.exe Namespace.Class.Method param1 param2

例:

MyProjectPrompt.exe It.Company.Math.Add 10 10

解決

ParameterInfo[] listaParametr = method_to_invoke.GetParameters();

ParameterInfo infoParam;
for(Int32 va=0;va<listaParametr.Length;va++)
{
    infoParam = listaParametr[va];

    for(Int32 va2=0;va2<args_values.Length;va2++)
    {
        if(args_names[va2]==infoParam.Name)
        {
            args_values[va2] = Convert.ChangeType(args_values[va2], 
                                                  infoParam.ParameterType);                        
        }
    }
}

基本的に、すべての Param が渡されるように、キャストします。その後、私はそれを動的に渡します:

Object result_object = target_class.InvokeMember(method, 
                           BindingFlags.InvokeMethod, null, target_object, 
                           args_values, null, null, args_names);
4

2 に答える 2

1

Convert.ChangeType元の値をメソッドで受け入れられるタイプに変更するために使用します。適切な変換が見つからない場合は、例外がスローされます。

于 2012-01-11T10:55:15.033 に答える
0

これはうまくいくはずです:

public class Test1
{
    public Int32 addNumer (Int32 a, Int32 b)
    {
         return (a+b);
    }
}


static void Main (string[] args)
{
    Byte a = 10;
    Byte b = 20;

    object test = new Test1();

    //note how I cast a and b to int 
    //int is an alias to Int32

    typeof(Test1).GetMethod("addNumber").Invoke(test, 
                          new object[] { (int)a, (int)b }); 
}
于 2012-01-11T10:51:16.750 に答える