2

抽象クラスでリフレクションを使用していますが、PropertyInfo.SetValue メソッドを使用して既存の List オブジェクトに値を割り当てることができないという問題が発生しています。

以下は、(非常に) 短縮されたクラス宣言です。

public abstract class User { }
public class Subscriber : User
{
    public string Name { get; set; }
    public List<string> AttributeList { get; set; }
}

User の内部には、要素数が不明な XML からデータを抽出するメソッドがあります。これらの要素を解析し、それらが User (またはその子のいずれか) のプロパティとして認識された場合は、プロパティを設定します。

private void ExtractElement(XElement inner)
{
    // Uses reflection to get the correct Derived class (Initiate, Member, Subscriber)
    Type tUser = this.GetType();

    var prop = tUser.GetProperty("AttributeList"); // hard-coded for brevity
    object value = "Random Value" // same

    var nullableType = Nullable.GetUnderlyingType(prop.PropertyType);
    if (nullableType == null)
        nullableType = prop.PropertyType;


    if (nullableType == typeof(int))
    {
        prop.SetValue(this, int.Parse(value as string), null);
    }
    else if (nullableType == typeof(List<string>))
    {
        var myList = (List<string>)(prop.GetValue(this, null));
        myList.Add(value as string);
        prop.SetValue(this, myList, null); // <- This doesn't save changes.
    }
    else
    {
        prop.SetValue(this, value as string, null);
    }

この最後のセクションにドロップすると、myList は正しく設定されます。しかし、AttributeList の値を myList に設定しようとすると、変更が反映されません。リフレクションに関する他の投稿から判断すると、(ボックス化/ボックス化解除のために) AttributeList のコピーを取得し、オリジナルではなくそれに影響を与えていると推測されます。このような状況でオリジナルに直接影響を与える方法はありますか? 変更が保存されていない場合、コードの最後の行でエラーがスローされないのはなぜですか?

4

1 に答える 1

2

リクエストに応じて:

if (nullableType == typeof(List<string>))
{
    ((List<string>)(prop.GetValue(this, null))).Add(value as string);
}
于 2013-03-21T21:56:24.190 に答える