c# generic Enum class 操作

c# generic Enum class operations

我正在努力实现以下目标:有一个方法可以获取通用枚举并检查该枚举是否来自同一 class 中定义的枚举,并有另一个方法返回成功检查的 Enum 的 int 值。

这是一个例子:

public class MyClass(){

    public enum MyValue{
        Value1,
        Value2,
        Value3,
    }

    public enum MyString{
        String1,
        String2,
        String3,
    }

    public void Usage(Enum something){
        if(IsRight(typeof(MyValue))){
            Console.WriteLine("something = " + GetInt(something));
        } else {
            Console.WriteLine("ERROR: something is not MyValue");
        }
        if(IsRight(typeof(MyString))){
            Console.WriteLine("something = " + GetInt(something));
        } else {
            Console.WriteLine("ERROR: something is not MyString");
        }
    }

    private bool IsRight(System.Type enumType){
        // THIS IS WRONG and I don't know how to do it...
        return enumType.IsAssignableFrom(MyClass);
    }

    private int GetInt(Enum enumeration){
        // is there a better way to do the int conversion?
        return (int)Convert.ChangeType(enumeration, typeof(int));
    }
}

实际上 GetInt 方法有效,但我想知道是否有更简单的方法来做到这一点。关于 IsRight 方法,我不知道如何去做。基本上问题是我需要检查传递的枚举值是否属于同一 class 中定义的任何枚举,该方法是为了避免用户向我传递 class 的枚举不知道。

非常感谢:-)

编辑 我很抱歉,因为这个例子可能不是很好。我知道我可以使用 is 关键字列出所有枚举,但因为我将在我的 class 中定义很多枚举,该函数的一个更好的示例可能是:

public class MyClass(){

    public enum MyValue{
        Value1,
        Value2,
        Value3,
    }

    public enum MyString{
        String1,
        String2,
        String3,
    }

    private List<string> m_cachedStrings = new List<string>();

    public void Usage(Enum something){
        CacheStrings(typeof(MyValue));
        CacheStrings(typeof(MyString));
    }

    private bool CacheStrings(System.Type enumType){

        // THIS IS WRONG and I don't know how to do it...
        if(!enumType.IsAssignableFrom(MyClass))
            return;

        foreach(var item in Enum.GetValues(enumType)){
            m_cachedStrings.Add(item.ToString());
        }
    }
}

试试这个:

private bool IsRight(System.Type enumType){
    return enumType.DeclaringType == typeof(MyClass);
}