【问题标题】:C# Enum error : is a 'type', which is not valid in the given contextC# 枚举错误:是一个“类型”,在给定的上下文中无效
【发布时间】:2013-04-02 13:11:51
【问题描述】:

我有一个 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
    }
}

这个类的存在是因为布尔值作为来自其他系统的输入字符串,所以我将它作为对象传递并从我的 Enum 类中将其转换为布尔值。

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

但我不知道如何解决它。更改方式:

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

也不行。

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

【问题讨论】:

  • 你为什么要重新定义bool?!
  • 我不知道为什么你需要那个枚举,即使你试图解释它。如果您在isAnOptionalValidValue 中展示您将如何使用它,也许会有所帮助。
  • @DanielA.White 从问题看来,他可以创建一个可选的布尔值。要是有framework support 就好了;-)

标签: c# .net enums


【解决方案1】:

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

UtilConstants.BooleanValues.TRUE | UtilConstants.BooleanValues.FALSE

或者如果你真的想检查输入字符串是否匹配枚举类型的常量,你应该改变签名:

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

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

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

【讨论】:

  • 在声明中使用作为参数(类型 enumType),在调用方法时使用 typeof,效果很好。所以我仍然可以将我的方法 isAnOptionalValidValue 用于任何类型的枚举和布尔值。非常感谢!
【解决方案2】:

你可能宁愿使用

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

而不是重新定义 bool。

您也可以将其“可选”为可空的布尔值(因此,如果没有 true 值,则 false 为空):

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

【讨论】:

  • 谢谢。您对重新定义布尔值是正确的。但就我而言,我想使用 isAnOptionalValidValue 方法,因为它的功能适用于分组在不同枚举中的不同值,并且也适用于 FALSE 和 TRUE 值。这就是为什么我为他们创建了一个枚举。重新定义布尔值可能没有必要也不是一个好主意,但我认为这使得 isAnOptionalValidValue 方法对布尔值也有效。
【解决方案3】:

Enum setOfValues 在参数列表中意味着您传递特定值,例如 BooleanValues.TRUE - 不是自己输入。要传递类型,请使用Type setOfValues

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

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

【讨论】:

  • 也感谢您的澄清。我没有意识到 Enum 类型意味着枚举值本身,而不是类型。
【解决方案4】:

您提到您从另一个系统获得了一个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.");
    }
}

【讨论】:

    猜你喜欢
    • 2021-12-02
    • 1970-01-01
    • 1970-01-01
    • 2011-01-17
    • 2016-03-30
    • 1970-01-01
    • 2018-08-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多