如何检查泛型类中的枚举集的值?

时间:2019-02-05 13:56:30

标签: c# .net

我正在寻找检查泛型类中的枚举集的值。当我尝试编写基本的if语句if (item.Value == AlphaType.A1)时,出现以下错误:

  

运算符'=='不能应用于类型'T'和'Program.AlphaType'的操作数

代码如下:

public enum AlphaType
{
    A1,
    A2
}

public enum BetaType
{
    B1,
    B2
}

public class Item<T>
{
    public T Value { get; set; }
    public string Foo { get; set;}
}

public static void Main()
{
    var item1 = new Item<AlphaType> { Value =  AlphaType.A1, Foo = "example 1" };
    var item2 = new Item<BetaType> { Value =  BetaType.B1, Foo = "example 2" };

    PrintAlphaFoo(item1);
    PrintAlphaFoo(item2);
}

public static void PrintAlphaFoo<T>(Item<T> item)
{
    if (item.Value == AlphaType.A1)
    {
        Console.WriteLine(item.Foo);
    }
}

Try it online!

此处代码应输出示例1 ,而不是示例2

2 个答案:

答案 0 :(得分:2)

由于类型不匹配,无法使用运算符。编译器无法知道T是您的枚举。您可以通过将值强制转换为对象然后再次强制转换为类型来修复它:

if ((AlphaType)(object)item.Value == AlphaType.A1)

或者我们甚至可以让Equals等于我们的演员并写:

if (item.Value.Equals(AlphaType.A1))

但是你不能在这里停下来。您的错误已修复,但不是主要问题。只有这样,示例2 才会被打印出来。您必须先进行另一项检查:

if (item.Value.GetType() == typeof(AlphaType) && (AlphaType)(object)item.Value == AlphaType.A1)

完整代码:

public enum AlphaType
{
    A1,
    A2
}

public enum BetaType
{
    B1,
    B2
}

public class Item<T>
{
    public T Value { get; set; }
    public string Foo { get; set;}
}

public static void Main()
{
    var item1 = new Item<AlphaType> { Value =  AlphaType.A1, Foo = "example 1" };
    var item2 = new Item<BetaType> { Value =  BetaType.B1, Foo = "example 2" };

    PrintAlphaFoo(item1);
    PrintAlphaFoo(item2);
}

public static void PrintAlphaFoo<T>(Item<T> item)
{
    if (item.Value.GetType() == typeof(AlphaType) && item.Value.Equals(AlphaType.A1))
    {
        Console.WriteLine(item.Foo);
    }
}

Try it Online

来源:

答案 1 :(得分:0)

您还可以尝试使用Enum.TryParse()这样的方法

    public static void PrintAlphaFoo<T>(Item<T> item)
    {
        AlphaType alphaType;
        if (!Enum.TryParse<AlphaType>(item.Value.ToString(), out alphaType))
        {
            return;
        }

        if (alphaType == AlphaType.A1)
        {
            Console.WriteLine(item.Foo);
        }
    }