C#枚举错误:是一种'类型',在给定的上下文中无效

时间:2013-04-02 13:11:52

标签: c# .net enums

我在C#(.NET 2.0)中有一个代码,我在其中使用输入Enum调用方法,但我无法使其工作。

我在方法isAnOptionalBooleanValue:

中有编译错误
    public static bool isAnOptionalBooleanValue(Status status, String parameterName,
            Object parameter) {

                return isAnOptionalValidValue(status, parameterName, parameter, 
                    UtilConstants.BooleanValues);
        }

    public static bool isAnOptionalValidValue(Status status, String parameterName,
            Object parameter, Enum setOfValues)
        {

                     ....
        }

在其他课程中:

public class UtilConstants
{
    public enum BooleanValues
    {
        TRUE, FALSE
    }
}

这个类的存在是因为boolean值来自其他系统的输入String,因此我将其作为Object传递并将其从我的Enum类转换为布尔值。

它返回的错误如下: “UtilConstants.BooleanValues”是'type',在给定的上下文中无效“ 返回isAnOptionalValidValue(...)行中的错误。

但我不知道如何修复它。改变它:

  

return isAnOptionalValidValue(status,parameterName,parameter,   typeof运算(UtilConstants.BooleanValues));

也不起作用。

有什么想法吗? 感谢您的帮助!

4 个答案:

答案 0 :(得分:5)

您需要使用实际值,而不是UtilConstants.BooleanValues(确实是类型而不是值)。像这样:

UtilConstants.BooleanValues.TRUE | UtilConstants.BooleanValues.FALSE

或者,如果您确实想要检查输入字符串是否与枚举类型的常量匹配,则应更改签名:

public static bool isAnOptionalValidValue(Status status, String parameterName,
                                          Object parameter, Type enumType)

这样您使用typeof建议的方法调用就可以了 然后,您可以通过调用Enum.GetValues(enumType)

来获取枚举的实际字符串值

答案 1 :(得分:5)

您可能宁愿使用

bool myBool;    
Boolean.TryParse("the string you get from the other system", out myBool);

而不是重新定义布尔。

你也可以将“可选”作为可以为空的bool(如果没有值为true,则为false,则为null):

bool? myBool = null;
bool tmp;
if (Boolean.TryParse("the string you get from the other system", out tmp))
    myBool = tmp;       

答案 2 :(得分:1)

参数列表中的

Enum setOfValues表示您传递特定值,如BooleanValues.TRUE - 而不是键入自身。要传递类型,请使用Type setOfValues

从字符串使用中解析特定的枚举值

BooleanValues enumValue = (BooleanValues)Enum.Parse(typeof(UtilConstants.BooleanValues), stringValue);

答案 3 :(得分:0)

您提到从其他系统获得string,您必须转换为Boolean类型。所以我没有使用枚举,而是为此目的编写自己的转换器:

public static class SpecificBooleanConverter
{
    private static Dictionary<string, bool> _AllowedValues;

    static SpecificBooleanConverter()
    {
        _AllowedValues = new Dictionary<string, bool>(StringComparer.CurrentCultureIgnoreCase);
        _AllowedValues.Add("true", true);
        _AllowedValues.Add("false", false);
        _AllowedValues.Add("foo", true);
        _AllowedValues.Add("bar", false);
    }

    public static bool TryParse(string value, out bool result)
    {
        return _AllowedValues.TryGetValue(value, out result);
    }
}

然后可以这样调用:

bool dotNetBoolean;
var booleansFromOtherSystem = new[] { "hello", "TRUE", "FalSE", "FoO", "bAr" };

foreach (var value in booleansFromOtherSystem)
{
    if (!SpecificBooleanConverter.TryParse(value, out dotNetBoolean))
    {
        Console.WriteLine("Could not parse \"" + booleansFromOtherSystem + "\".");
    }

    if (dotNetBoolean == true)
    {
        Console.WriteLine("Yes, we can.");
    }
    else
    {
        Console.WriteLine("No, you don't.");
    }
}