2

structメソッドを使用して、 を返すメソッドを呼び出したいと思いますMethodInfo.Invoke。ただし、このメソッドの返される変数の型はobjectであり、 にキャストすることはできませんstruct

( から に切り替える提案と同様に、ここで見つけましstructclasshttp://msdn.microsoft.com/en-us/library/b7tch9h0(VS.90).aspx )

では、呼び出されたメソッドの (値) 結果を適切な型にキャストするにはどうすればよいでしょうか?

(単純なキャストも試しましたが、InvalidCastException がスローされました)

ここに私のコードのいくつかのチャンクがあります:

public class MyInvokedClass
{
    public struct MyStruct
    { ... };

    public MyStruct InvokedMethod()
    { 
        MyStruct structure;
        ... 
        return structure; 
    }
}

public class MyInvokingClass
{
    // Same structure here
    public struct MyStruct
    { ... };

    static void Main(string[] args)
    { 
        ...
        MethodInfo methodInfo = classType.GetMethod(methodName);
        MyStruct result = (MyStruct)methodInfo.Invoke(classInstance, null); 
        // the line above throws an InvalidCastException
    }
}

皆さん、ありがとうございました!

4

3 に答える 3

3

型が異なるため、キャストは失敗します。より具体的には、1 つはMyInvokedClass.MyStructで、もう 1 つは ですMyInvokingClass.MyStruct

InvokedMethodgets が呼び出されたときはMyStruct内にネストされた型を参照しますMyInvokedClassが、キャストが実行されたとき は(MyStruct)内にネストされた型を参照しMyInvokingClassます。

MyInvokedClass.MyStructinsideを使用して正しい構造体を参照することもできますが、型MyInvokingClassを 1 つだけ持つ方がさらに優れていMyStructます。

宣言空間についてもっと読むと役に立つかもしれません:

C# の基本概念 — 宣言

于 2011-05-31T14:59:09.263 に答える
3

と の 2 つのタイプがMyInvokedClass.MyStructありMyInvokingClass.MyStructます。

呼び出しているメソッドはおそらく返され、それを .MyInvokedClass.MyStructにキャストしようとしていますMyInvokingClass.MyStructInvalidCastExceptionこれらは2つの完全に異なるタイプであるため、あなたはヒットしています。

于 2011-05-31T14:59:48.187 に答える
2

問題を解決するには、構造をクラスから移動します。

public struct MyStruct
{ ... };

public class MyInvokedClass
{
    public MyStruct InvokedMethod()
    { 
        MyStruct structure;
        ... 
        return structure; 
    }
}

public class MyInvokingClass
{
    static void Main(string[] args)
    { 
        ...
        MethodInfo methodInfo = classType.GetMethod(methodName);
        MyStruct result = (MyStruct)methodInfo.Invoke(classInstance, null); 
    }
}
于 2011-05-31T15:01:55.203 に答える