C #: Как мы пытаемся разобрать на основе условия? - PullRequest
0 голосов
/ 08 июля 2019

Пытаюсь попробовать разобрать на основе условия между двумя перечислениями, как нам это сделать?

bool _isEnum1 = true;

public enum _Enum1
{
value,
Text,
Image
}

public enum _Enum2
{
TextArea,
Button,
Label
}

var _enum = _isEnum1 ? Enum.TryParse("value", out _Enum1 _enum) : Enum.TryParse("TextArea", out _Enum2 _enum)

Я хочу, чтобы _enum содержал правильное значение типа enum. Это возможно? Любая другая альтернатива тоже подойдет.

Ответы [ 2 ]

1 голос
/ 08 июля 2019

Ну, вы пытаетесь динамически разрешить тип во время выполнения.Вы должны либо разделить весь поток программы

if(_isEnum1)
{
    Enum1 e = (Enum1)Enum.Parse(typeof(Enum1), "value");
    HandleEnum1(e);
}
else
{
    Enum2 e = (Enum2)Enum.Parse(typeof(Enum2), "value");
    HandleEnum2(e);
}

, где HandleEnumX строго набирается с EnumX, чтобы компилятор знал, что происходит, либо полностью сходить с ума за борт и использовать dynamic

dynamic e;
if(_isEnum1)
{
    e = (Enum1)Enum.Parse(typeof(Enum1), s);
}
else
{
    e = (Enum2)Enum.Parse(typeof(Enum2), s);
}
// Now e is either Enum1 or Enum2, resolved at runtime.

Тем не менее, это кажется чрезмерно сложным и более продуманным экспериментом, чем реальный код, который вы должны продвигать в производство.Вы, вероятно, должны пересмотреть свой дизайн этой части программы.По крайней мере, вы можете захотеть обернуть свои перечисления в классе, чтобы обеспечить более гибкий дизайн.

В качестве примечания: вы используете TryParse, но никогда не проверяете возвращаемое значение, поэтому я взялсвобода обмена их на Parse.

0 голосов
/ 08 июля 2019
Enum result;
if (this._isEnum1)
{
    result = (_Enum1)Enum.Parse(typeof(_Enum1), "value");

}
else
{
    result = (_Enum2)Enum.Parse(typeof(_Enum2), "TextArea");
}
...