C# 4.0 如何使用C#中的反射设置只读属性值?
对于测试,我需要设置只读属性的值。这是我的密码:C# 4.0 如何使用C#中的反射设置只读属性值?,c#-4.0,reflection,C# 4.0,Reflection,对于测试,我需要设置只读属性的值。这是我的密码: public void SetPrivatePropertyValue<T>(object obj, string propName, T val) { Type t = obj.GetType(); var prop = t.GetProperty(propName, BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);
public void SetPrivatePropertyValue<T>(object obj, string propName, T val)
{
Type t = obj.GetType();
var prop = t.GetProperty(propName, BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);
if (prop == null)
throw new ArgumentOutOfRangeException("propName", string.Format("Property {0} was not found in Type {1}", propName, obj.GetType().FullName));
t.InvokeMember(propName, BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.SetProperty | BindingFlags.Instance, null, obj, new object[] { val });
}
但错误是:
未找到属性集方法
这里出了什么问题?该属性没有set方法,因此您无法调用它。对于没有setter的readonly属性,必须有一些支持字段,否则CLR也将无法设置其值。对吗?如何找到备份字段?.Net元数据中的属性基本上只引用了最多3个方法(.get、.set、.other),假设每个属性都有备份字段是不安全的;想象一下
int-Prop{get{return 1;}}
或者一个具有更复杂getter方法的方法。当您知道有一个支持字段并且getter中不再有涉及该字段的操作时,您可以获取getter方法PropertyInfo.getmethod()
,解析IL指令MethodBase.GetILAsByteArray()
,搜索stfld/stsfld操作码
,然后解析其令牌Module.ResolveField()
获取FieldInfo对象。
prop.SetValue(obj, true, null);