En mi opinión, es bueno utilizar AbstractDataType patrón en cualquier lugar en donde se utiliza un valor general, con intenciones específicas (este caso se ha hecho por muchos otros con ejemplos como porcentaje, ReadonlyString, ConnectionString, etc.)
Nota: Personalmente, creo que tener conversiones implícitas desde y hacia ellos hace que todo termine (al tener una conversión implícita, ya no hay garantía del compilador de que los valores genéricos se usen con intención específica en el lugar correcto) .
Aquí hay una muestra que debería inspirarlo para que lo haga a su manera: aún puede elegir el nivel de conveniencia/verbosidad que prefiera.Se muestran dos enfoques:
- índices _byInt un diccionario por PseudoInt
- índices _byEnum un diccionario mediante una enumeración: tipo int
Notas
- si se quiere #define IMPLICIT_CONVERSIONS obtener conversiones implícitas al tipo de índice base (por lo que a int o a la enumeración)
- este extrapola a todos los tipos de valores, incluidos los definidos por el usuario (probarlo con su estructura XYZCoord :))
- echar un vistazo overhere if you really wanted conversions to and from Enum types
Sin más preámbulos:
#define IMPLICIT_CONVERSIONS
using System.Collections.Generic;
namespace NS
{
public enum PositionEnum : int { Begin = 0, Normal = 1, End = 99 }
public struct Pseudo<T> where T : struct
{
public T Value;
public Pseudo(T value) { Value = value; }
#if IMPLICIT_CONVERSIONS
public static implicit operator T(Pseudo<T> pi) { return pi.Value; }
public static implicit operator Pseudo<T>(T ni) { return new Pseudo<T>(ni); }
#endif
}
static class Program
{
private static Pseudo<T> AsPseudo<T>(this T value) where T : struct
{
return new Pseudo<T>(value);
}
private static readonly IDictionary<Pseudo<int>, string> _byInt =
new Dictionary<Pseudo<int>, string>()
{ { 0, "aap" },
{ 1, "noot" },
{ 99, "mies" },
};
private static readonly IDictionary<Pseudo<PositionEnum>, string> _byEnum =
new Dictionary<Pseudo<PositionEnum>, string>()
{ { PositionEnum.Begin, "aap" },
{ PositionEnum.Normal, "noot" },
{ PositionEnum.End, "mies" },
};
public static void Main(string[] args)
{
string s;
s = _byInt[0];
s = _byEnum[PositionEnum.Normal];
}
}
}
Esta es claramente una mejor solución que la mía. –
Parece correcto y lo que se preguntó, pero es un poco sobrecargado ... Y para la legibilidad (y la seguridad) omitiría la conversión implícita. –
@Henk: El punto entero de esto es la conversión implícita; 'Dañe la legibilidad tanto como pensaría cuando solo funciona de una manera. – configurator