Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 4.0 如何使用C#中的反射设置只读属性值?_C# 4.0_Reflection - Fatal编程技术网

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);