首页 新闻 会员 周边 捐助

关于使用反射后实例的初始化问题

0
悬赏园豆:10 [待解决问题]

小弟最近在做一个项目,使用到了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);
    }
刘 林的主页 刘 林 | 初学一级 | 园豆:192
提问于:2019-02-26 13:49

您好,请问您的程序里面BindingFlags.Instance | BindingFlags.NonPublic);是怎么写定义的呢?我一直有各种错误提示,改来改去也不对。麻烦指教!

柏十八 5年前

@柏十八: 对不起,没听懂你要问的问题。这两个表示就用在获取属性的方法里面,没有用在其他的地方呀!

刘 林 5年前

@刘 林: 如果直接写的话就会提示BindingFlags在上下文中找不到,我是新学c#,搞不太懂应该怎么改这个,在网上也查不到,一头乱麻。。方便的话我可以加您的微信吗?我的微信号是Toilrana。谢谢您

柏十八 5年前

@柏十八: 没有导入正确的命名空间吧?

刘 林 5年前

@刘 林: 啊确实是这样!非常感谢您!导入了之后就解决了,之前我钻了牛角尖,一直往错误的方向改,所以怎样都出错。感谢您的耐心回复!

柏十八 5年前
< >
分享
所有回答(1)
0

不能,反射并不是给对象重新赋值的操作,如果不理解建议再看看反射的定义。

老渣 | 园豆:210 (菜鸟二级) | 2019-03-01 18:02

是不是可以理解为“通过反射,已经对类的定义进行了动态的修改,除非用反射进行改回,否则都会按照最新的修改后的类定义进行类的初始化”?

支持(0) 反对(0) 刘 林 | 园豆:192 (初学一级) | 2019-03-01 18:06
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册