天天看点

C# 可以利用反射给只读属性赋值吗?

结论:可以

验证demo如下:

运行winform程序输出:

C# 可以利用反射给只读属性赋值吗?

小注:

        typedescriptor.getproperties用来setvalue这没有作用:

那么为什么typedescriptor.getproperties用来setvalue没有效果呢?

将上面的代码拆成如下两句:

单点跟踪进去,可以发现:

C# 可以利用反射给只读属性赋值吗?

在获取到propertydescriptor这个抽象类的实例后,在调用setvalue方法的时候,是从其子类reflectpropertydescriptor调用的。

C# 可以利用反射给只读属性赋值吗?
C# 可以利用反射给只读属性赋值吗?

而具体的实现是在子类:reflectpropertydescriptor中,从微软源码中找到reflectpropertydescriptor及setvalue

从代码中可以看出来,只读属性直接被跳过去了。。。。。。

那么propertyinfo有没有什么限制呢?

propertyinfo调用的setvalue如下所示:

C# 可以利用反射给只读属性赋值吗?

在微软开源的代码中可以找到其具体实现如下:

暂时没有看到propertyinfo调用的setvalue有什么限制

<a target="_blank" href="https://msdn.microsoft.com/zh-cn/library/scfx0019">propertyinfo.getsetmethod 方法 (boolean)</a>

C# 可以利用反射给只读属性赋值吗?