我正在使用对抽象类的反射,并遇到一个我无法使用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的副本(因为装箱/取消装箱?),并影响它而不是原始的。在这种情况下有没有办法直接影响原作?如果没有保存更改,为什么我的代码的最后一行不会抛出错误?
答案 0 :(得分:2)
根据要求:
if (nullableType == typeof(List<string>))
{
((List<string>)(prop.GetValue(this, null))).Add(value as string);
}