首页 新闻 会员 周边 捐助

CLR有无途径可在运行时改变对象的元数据

1
悬赏园豆:40 [待解决问题]

类似于定义了

public Test()
{
    public int A
    {
        get;
        set;
    }
}

有无办法在代码运行时,修改A属性的get方法和set方法,让它们不是默认实现,就像

public Test()
{
    public int A
    {
        get{ return 1; }
        set;
    }
}

解决了这个用途还是挺多的,就像监测对象状态什么的,还有WPF的属性改变通知也可以更方便的做。

灰机_不会飞的主页 灰机_不会飞 | 初学一级 | 园豆:8
提问于:2014-06-27 18:43
< >
分享
所有回答(6)
0

可以模仿简单的JavaBean做法,例如:

 

public class A{
       private String id;
       public String getId(){
            return this.id;
       }
       public void setId(String id){
            this.id = id;
       }
 }

 

wongdavid | 园豆:394 (菜鸟二级) | 2014-06-29 15:16

我指的是元数据,即类的定义数据,不是属性的值

支持(0) 反对(0) 灰机_不会飞 | 园豆:8 (初学一级) | 2014-06-29 15:33
0

能在运行时做相关操作只有反射,但是反射也只能是 取值赋值调用方法 取实例,.net Framework 没有提供在运行时修改代码的方法,而且这样做会让程序变得不安全

Zery | 园豆:6151 (大侠五级) | 2014-06-29 17:32

这几天搜索下来确实是没办法,一个类型安全的系统就应该确保类型元数据创建后不可变,这个 CLR 必须保证的。

支持(0) 反对(0) 灰机_不会飞 | 园豆:8 (初学一级) | 2014-06-29 18:17
0

可以用委托来实现,不过委托只能对方法来操作,你可以通过这个来实现

刘宏玺 | 园豆:14020 (专家六级) | 2014-06-30 09:30
0

没太看明白你的需求是什么,如果想实现动态属性的话,.net 4.0的 IDynamicMetaObjectProvider 就可以做到。
看看默认提供的 ExpandoObject 或 DynamicObject 是否满足你的要求。

天方 | 园豆:5432 (大侠五级) | 2014-07-02 13:29
0

直接使用dynamic,这样就可以随便变了

ocean | 园豆:824 (小虾三级) | 2014-07-03 15:41
0

用接口

   interface ITest
    {
        int A { get; set; }
    }

    class B : ITest
    {
        private int _a;
        public int A
        {
            get { return _a; }
            set { _a = value; }
        }
    }

这是很基本的面向对象的多态原则。

希望我的回答有用

CTRA王大大 | 园豆:30 (初学一级) | 2014-09-12 11:30

很遗憾没用,我问得是元数据,不是属性值

支持(0) 反对(0) 灰机_不会飞 | 园豆:8 (初学一级) | 2014-09-12 11:32
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册