hunterniss
hunterniss
采纳率50%
2019-10-08 15:46

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

10
  • c#
已采纳

例如:

Class Person{
    string Name;
    int Age;

    void Work(){     
        //此处Work方法仅在Age大于等于16岁时起效
        //即,若属性Age小于16岁,此Person视为不存在Work方法
    }
}
  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享
  • 邀请回答

3条回答

  • caozhy 从今以后生命中的每一秒都属于我爱的人 2年前
    可以用委托实现:
    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 评论 复制链接分享
  • JonathanYan JonathanYan 2年前

    没有这种代码,不允许类里既有一个函数又没有。
    除非你实现两个类,一个成年人(大于16岁),一个未成年人,然后构造的时候根据年龄判断构造哪个类。

    class Person{
        Person(int a);
        int age;
    }
    class Adolescent: Person{
        Adolescent(int a);
    }
    class Adult: Person{
        Adult(int a);
        void work();
    }
    Person createPerson(int age){
        if( age <= 16 )
            return Adolescent(age);
        else
            return Adult(age);
    }
    

    如果只是希望小于16岁函数不工作,这么写

    class Person{
        int age;
        void work(){
            if( age <= 16 )
                return;
            //你的代码
        }
    }
    
    点赞 评论 复制链接分享
  • qq_27599069 qq_27599069 2年前

    Work方法中,如果Age<16就Return 就OK
    至于你方的效果不存在的

    点赞 评论 复制链接分享

相关推荐