在为抽象类中的集合设置值时遇到问题

本文关键字:遇到 问题 设置 集合 抽象类 | 更新日期: 2023-09-27 18:05:06

我正在处理抽象类的反射,并且遇到了一个问题,我无法使用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的副本(因为装箱/拆箱?),并影响了它而不是原始的。在这种情况下,有没有一种方法可以直接影响原作?如果没有保存更改,为什么最后一行代码不会抛出错误?

在为抽象类中的集合设置值时遇到问题

按要求:

if (nullableType == typeof(List<string>))
{
    ((List<string>)(prop.GetValue(this, null))).Add(value as string);
}