hunterniss 2019-10-08 15:46 采纳率: 50%
浏览 285
已采纳

C#有没有特性能够实现某些方法只在特定条件下起效?

例如:

Class Person{
    string Name;
    int Age;

    void Work(){     
        //此处Work方法仅在Age大于等于16岁时起效
        //即,若属性Age小于16岁,此Person视为不存在Work方法
    }
}
  • 写回答

3条回答 默认 最新

  • threenewbee 2019-10-08 17:25
    关注
    可以用委托实现:
    Class Person{
        string Name;
        int Age;
    public Person(string s, int a) { Name = s, Age = a; }
        public Action Work
            {
            get { if (Age > 16) return () => { Console.WriteLine("work"); }; else return () => {}; }
            }
    }
    
    调用
    
    Person p = new Person("aa", 20);
    p.Work();
    Person p1 = new Person("bb", 12);
    p1.Work();
    

    顺便说下,attribute单纯使用不能适用这个场景,需要通过dynamic proxy封装。但是会改变你的调用者代码。
    除了使用委托,还有就是用emit/codedom动态生成代码


    你还可以不用lambda表达式

    Class Person{
        string Name;
        int Age;
    public Person(string s, int a) { Name = s, Age = a; }
        public Action Work
            {
            get { if (Age > 16) return new Action(work); else throw new NotImplementedException(); }
            }
            private void work()
            {
            ...
            }
    }
    

    你提到类似System.ObsoleteAttribute,是否可以有自己的特性,这个不行,因为判断这些特性的逻辑写死在编译器里,没办法扩展。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥15 MATLAB怎么通过柱坐标变换画开口是圆形的旋转抛物面?
  • ¥15 寻一个支付宝扫码远程授权登录的软件助手app
  • ¥15 解riccati方程组
  • ¥15 display:none;样式在嵌套结构中的已设置了display样式的元素上不起作用?
  • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
  • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
  • ¥50 树莓派安卓APK系统签名
  • ¥65 汇编语言除法溢出问题
  • ¥15 Visual Studio问题
  • ¥20 求一个html代码,有偿