我现在开发一个框架。想控制一个参数必须是
有[flags]表示int类型枚举 要怎么实现

解决方案 »

  1.   


            [FlagsAttribute]
            public enum FlagsTest : int
            {
                a1=0,
                a2=1,
                a3=2,
                a4=4,
                a5=8,
                a6=16        }关键是每个枚举成员必须是2的N(0,1,2....)次方,不能有重复的
      

  2.   

    static void Test(object v)
    {
        if (v is Enum == false ||
            Enum.GetUnderlyingType( v.GetType() ) != typeof(int) ||
            System.ComponentModel.TypeDescriptor.GetAttributes(v)[typeof(FlagsAttribute)] == null)
        {
            throw new Exception("v is not a flagged enum");  //<----
        }
    }
    或者
    static void Test(Enum v)
    {
      //...
    }
      

  3.   

            public enum FlagsTest : int
            {
                a1=0,
                a2=1,
                a3=2,
                a4=4,
                a5=8,
                a6=16
            }
    根据需求,不一定要是2的次方,最好不要硬性规定每个玫举的值,(书上说的)
      

  4.   

    这个无法实现约束,需要指明类型,也就是先定义出枚举类型,然后放一个该类型的参数,你不能放一个参数,然后约束一定是某种不确定的枚举。那你可以用object类型的参数,在函数最开始进行参数类型检查,看是否是枚举,不过这应该不是你期待的对么。如果是框架搭建,会考虑很多非具体的实现,但枚举必须是具体的。而枚举的用法一般和if,else if或switch搭配,这本身并不是在框架中一个很好的设计,最好是使用多态的方式将这类问题拆开。记得以前学OO的时候看过java的人说一句话,当然他只是理论上,说多态可以替换你程序里所有的if,else,switch。我的建议,在设计框架的时候,尽量的少用枚举类型,一定要用,你就会让你的框架在设计之初就有局限性了。个人愚见,仅供参考。
      

  5.   

    我想用
    static void Test(Enum v)
    {
      //...
    }但是不能保证这类型 [FlagsAttribute] 和 int的
      

  6.   

    也可以在框架不用枚举类型。传入参数就INT的,这样在框架使用者,很难知道2个参数是有联系的,而且还必须进行位操作的。
      

  7.   

    那你不妨将这个方法直接定义成一个委托,由子类实现或对这个委托进行配置,实现你的效果。你的委托可以类似这样写public abstract class A<T1>
    {
        public Func<T1, T1, T1> GetMixType;
    }public class B : A <B.MyType1>
    {
        public B()
        {
            GetMixType = _GetMixType;
        }    private MyType1 _GetMixType(MyType1 x, MyType1 y)
        {
            return x ^ y;
        }    public enum MyType1 { a, b, c }
    }
      

  8.   

    调用也贴下把。应该很直观了
    B x = new B();
    x.GetMixType(B.MyType1.a, B.MyType1.b);