2

オブジェクトの解析に対して動的なテキストを実行しようとしていますが、構造体のネストされたプロパティ値を作成および設定するときに問題が発生しました。

構造体であるオブジェクトにプロパティがある場合、リフレクションを使用して構造体オブジェクトを取得し、そのプロパティ/フィールドのいずれかを設定するたびに、オブジェクトの値は変更されません。以下のオブジェクトグラフを見てください。

public struct MyStruct
{
    public int MyIntProp {get;set;}
}

public class MyObj
{
    public MyStruct NestedStruct {get;set;}
}

PropertyInfo pInfo = (myObj.GetType()).GetProperty("NestedStruct");
object nestedStruct = pInfo.GetValue(myObj); // This is the nested struct however it is only a copy not the actual object
PropertyInfo intInfo = (pInfo.PropertyType).GetProperty("MyIntProp");
intInfo.SetValue(nestedStruct, 23); // this sets the MyIntProp on the nestedStruct, but it is not set on the myObj.NestedStruct.  My goal is to set object on that NestedStruct via reflection.

リフレクションを使用してNestedStructプロパティを取得し、その構造体にMyIntPropを設定しても、元のMyObj.NestedStruct.MyIntPropは変更されません。当然、これは構造体が値型であり、参照型ではないという事実に起因します。

したがって、本当の問題は、リフレクションを使用して値型への参照を取得する方法です。

4

1 に答える 1

5

オブジェクトに構造体であるプロパティがある場合、リフレクションを使用して構造体オブジェクトを取得し、そのプロパティ/フィールドのいずれかを設定しても、オブジェクトの値は変更されません。

ええと、いいえ-この行で:

object nestedStruct = pInfo.GetValue(myObj);

...値型であるため、値をコピーしています。また、それをボックス化しています-これは問題ありません。これは、intInfo.SetValue呼び出しでそれを変更すると、ボックス化されたコピーが変更されることを意味するためです。( を呼び出す時点でボックス化していた場合intInfo.SetValue、それは本当に絶望的です。)

ボックス化されたコピー内で変更を行った後、それをオブジェクトのプロパティに戻す必要があります。

pInfo.SetValue(myObject, nestedStruct);

リフレクションを使用せずに、あなたがしていることをやってみるのは有益でしょう:

MyObj myObj = new MyObj();
myObj.NestedStruct.MyIntProp = 23;

コンパイラは最後の行でエラーを表示し、それはばかげたことだと説明します。

Test.cs(20,9): エラー CS1612: 変数ではないため、'MyObj.NestedStruct' の戻り値を変更できません

于 2012-11-07T15:50:58.427 に答える