2013-04-02 10 views
1

У меня есть код в C# (.NET 2.0), где я вызываю метод с входным Enum, но мне не удается это сделать Работа.C# Ошибка перечисления: это «тип», который недопустим в заданном контексте

У меня есть ошибки компиляции в методе 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 (...) линии.

Но я не понимаю, как это исправить. Изменение его:

возвращения isAnOptionalValidValue (статус, ParameterName, параметр, TYPEOF (UtilConstants.BooleanValues));

также не работает.

Любые идеи? Благодарим вас за помощь!

+6

почему вы переосмысление 'bool' ?! –

+0

Я понятия не имею, зачем вам это перечисление, даже если вы попытались это объяснить. Возможно, это поможет, если вы покажете, что вы будете делать с ним в 'isAnOptionalValidValue'. –

+2

@ DanielA.White Из вопроса, похоже, что он может создать необязательное логическое значение. Если только была [поддержка рамок] (http://msdn.microsoft.com/en-gb/library/b3h38hb0 (v = vs.80) .aspx) для этого ;-) –

ответ

4

Вместо UtilConstants.BooleanValues (который действительно является типом, а не значением), вам необходимо использовать фактические значения. Как это:

UtilConstants.BooleanValues.TRUE | UtilConstants.BooleanValues.FALSE 

Или, если вы действительно хотите, чтобы проверить, если входная строка совпадает с константой типа перечислений, вы должны изменить подпись:

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

Таким образом, ваш предлагаемый метод вызова с использованием typeof должно сработать.
Вы могли бы получить фактические значения струны перечисления по телефону Enum.GetValues(enumType)

+0

Использование в качестве аргумента (Тип enumType) в объявление и тип при вызове метода работают отлично. Поэтому я могу использовать мой метод isAnOptionalValidValue для любого типа Enum, а также boolean. Большое спасибо ! – pablof

1

Enum setOfValues в списке параметров означает что вы проходя определенное значение как BooleanValues.TRUE - сам не тип. Для прохождения типа используйте Type setOfValues.

Для разбора конкретного значения перечисления из строки используйте

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

Спасибо за разъяснение. Я не понимал, что тип Enum означает значение enum, а не тип. – pablof

4

Вы можете использовать вместо

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

вместо переопределения BOOL.

Вы также можете сделать это «по желанию», как обнуляемого BOOL (так что, если не значение истина, ложь не пришло нуль):

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

Спасибо. Вы правы в переопределении булевых. Но в моем случае я хотел бы использовать метод isAnOptionalValidValue, потому что его функциональность применима к различным значениям, сгруппированным в разные Enums, а также должна работать для значений FALSE и TRUE. Вот почему я создал перечисление для них. Возможно, это не было бы необходимым или хорошей идеей переопределить логическое значение, но я думаю, что делает метод isAnOptionalValidValue действительным и для логических. – pablof

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."); 
    } 
} 
Смежные вопросы