小弟最近在做一个项目,使用到了C#的反射机制,现在遇到了一个问题,希望有大神可以解决下。
我用以下函数对我的一个类Taonei的属性进行了改变,默认只读属性为false,通过这个函数改成了true,但是在有new初始化新的实例是,为什么初始化的新实例的可读属性还是true呢?可以让反射机制不作用在初始化的实例上么?
[ReadOnly(false)] //默认设置其实例的只读属性为false
class TaoNei
/// <summary>
/// 设置类的只读属性
/// </summary>
/// <param name="myobj">需设置的属性表</param>
/// <param name="Readonly">只读为true,可写为false</param>
void SetClassReadonly(object myobj, bool Readonly)
{
if (myobj == null) return; //myobj就是类TaoNei的一个实例
Type readonlyType = typeof(ReadOnlyAttribute);
FieldInfo fld = readonlyType.GetField("isReadOnly", BindingFlags.Instance | BindingFlags.NonPublic);
System.ComponentModel.AttributeCollection attrs = TypeDescriptor.GetAttributes(myobj);
fld.SetValue(attrs[typeof(ReadOnlyAttribute)], Readonly);
}
不能,反射并不是给对象重新赋值的操作,如果不理解建议再看看反射的定义。
是不是可以理解为“通过反射,已经对类的定义进行了动态的修改,除非用反射进行改回,否则都会按照最新的修改后的类定义进行类的初始化”?
您好,请问您的程序里面BindingFlags.Instance | BindingFlags.NonPublic);是怎么写定义的呢?我一直有各种错误提示,改来改去也不对。麻烦指教!
– 柏十八 5年前@柏十八: 对不起,没听懂你要问的问题。这两个表示就用在获取属性的方法里面,没有用在其他的地方呀!
– 刘 林 5年前@刘 林: 如果直接写的话就会提示BindingFlags在上下文中找不到,我是新学c#,搞不太懂应该怎么改这个,在网上也查不到,一头乱麻。。方便的话我可以加您的微信吗?我的微信号是Toilrana。谢谢您
– 柏十八 5年前@柏十八: 没有导入正确的命名空间吧?
– 刘 林 5年前@刘 林: 啊确实是这样!非常感谢您!导入了之后就解决了,之前我钻了牛角尖,一直往错误的方向改,所以怎样都出错。感谢您的耐心回复!
– 柏十八 5年前