Estoy tratando de descubrir la sintaxis que admite unboxing un tipo integral (corto/int/largo) a su tipo intrínseco, cuando el tipo en sí es desconocido.Desempaquetar en un tipo desconocido
Aquí está un ejemplo completamente artificial que demuestra el concepto:
// Just a simple container that returns values as objects
struct DataStruct
{
public short ShortVale;
public int IntValue;
public long LongValue;
public object GetBoxedShortValue() { return ShortVale; }
public object GetBoxedIntValue() { return IntValue; }
public object GetBoxedLongValue() { return LongValue; }
}
static void Main(string[] args)
{
DataStruct data;
// Initialize data - any value will do
data.LongValue = data.IntValue = data.ShortVale = 42;
DataStruct newData;
// This works if you know the type you are expecting!
newData.ShortVale = (short)data.GetBoxedShortValue();
newData.IntValue = (int)data.GetBoxedIntValue();
newData.LongValue = (long)data.GetBoxedLongValue();
// But what about when you don't know?
newData.ShortVale = data.GetBoxedShortValue(); // error
newData.IntValue = data.GetBoxedIntValue(); // error
newData.LongValue = data.GetBoxedLongValue(); // error
}
En cada caso, los tipos integrales son consistentes, por lo que debería haber alguna forma de sintaxis que dice "el objeto contiene un tipo simple de X, devuelve eso como X (aunque no sé qué es X) ". Debido a que los objetos en última instancia provienen de la misma fuente, realmente no puede haber un desajuste (¡corto! = Largo).
Pido disculpas por el ejemplo inventado, me pareció la mejor manera de demostrar la sintaxis.
Gracias.
Todos los métodos 'GetBoxed' devuelven' LongValue'. ¿Error de tipografía? – unholysampler
¿Qué quiere decir "no puede haber un desajuste"? Si conoce el tipo, entonces no puede haber; si no lo haces, entonces puede haberlo. –
¿Cómo le gustaría usar el resultado de su desempaquetado? Si no sabes el tipo después de unboxing, entonces no puedes hacer nada con él (aparte de adivinar y usar 'dynamic'). Si conoces el tipo después del desempaquetado, entonces desmarca de ese tipo. En su ejemplo, usted sabe que a newData.IntValue solo se le puede asignar un int, por lo que _have_ que hacer 'newData.IntValue = (int) yourUnknownBoxedValue;'. Si esto falla, no puede asignarlo a newData.IntValue. Si no falla, entonces estás bien. Entonces, lo que estoy diciendo es realmente: deberías pensar en un ejemplo no artificial, porque esto no tiene sentido. – Joren