Это может быть сумасшедшим, но если вы жесткие около эмуляции Нержавеющего как перечисления в C#, вы можете сделать это с помощью некоторых дженериков. Бонус: вы сохраняете тип безопасности, а также получаете Intellisense из сделки! Вы потеряете небольшую гибкость с различными типами значений, но я думаю, что безопасность, вероятно, стоит того, что неудобно.
enum Option
{
Some,
None
}
class RustyEnum<TType, TValue>
{
public TType EnumType { get; set; }
public TValue EnumValue { get; set; }
}
// This static class basically gives you type-inference when creating items. Sugar!
static class RustyEnum
{
// Will leave the value as a null `object`. Not sure if this is actually useful.
public static RustyEnum<TType, object> Create<TType>(TType e)
{
return new RustyEnum<TType, object>
{
EnumType = e,
EnumValue = null
};
}
// Will let you set the value also
public static RustyEnum<TType, TValue> Create<TType, TValue>(TType e, TValue v)
{
return new RustyEnum<TType, TValue>
{
EnumType = e,
EnumValue = v
};
}
}
void Main()
{
var hasSome = RustyEnum.Create(Option.Some, 42);
var hasNone = RustyEnum.Create(Option.None, 0);
UseTheEnum(hasSome);
UseTheEnum(hasNone);
}
void UseTheEnum(RustyEnum<Option, int> item)
{
switch (item.EnumType)
{
case Option.Some:
Debug.WriteLine("Wow, the value is {0}!", item.EnumValue);
break;
default:
Debug.WriteLine("You know nuffin', Jon Snow!");
break;
}
}
Вот еще один пример, демонстрирующий использование специального ссылочного типа.
class MyComplexValue
{
public int A { get; set; }
public int B { get; set; }
public int C { get; set; }
public override string ToString()
{
return string.Format("A: {0}, B: {1}, C: {2}", A, B, C);
}
}
void Main()
{
var hasSome = RustyEnum.Create(Option.Some, new MyComplexValue { A = 1, B = 2, C = 3});
var hasNone = RustyEnum.Create(Option.None, null as MyComplexValue);
UseTheEnum(hasSome);
UseTheEnum(hasNone);
}
void UseTheEnum(RustyEnum<Option, MyComplexValue> item)
{
switch (item.EnumType)
{
case Option.Some:
Debug.WriteLine("Wow, the value is {0}!", item.EnumValue);
break;
default:
Debug.WriteLine("You know nuffin', Jon Snow!");
break;
}
}
У меня есть идея, которая включает в себя метод расширения и, возможно, отражение, звуки уже усложнены, поэтому я не думаю, что это квалифицируется как «лучший способ». Все еще интересно? – nilbot
Я думаю, это было бы полезно, если бы вы представили пример того, чего вы хотите достичь, вместо того, чтобы направлять людей к документу у вас будет больше шансов получить ответ. Просто взглянув на документацию, я согласен с @tweellt. – Dzyann
См. Http://stackoverflow.com/questions/3151702/discriminated-union-in-c-sharp – AlexFoxGill