2011-04-13 12 views
6

Estoy tratando de hacer algunas cosas de serialización/deserialización con un tipo de excepción personalizado. Este tipo tiene un campo definido como:¿Es posible alias tipo de matriz en C#?

private object[] resourceMessageParams; 

Tengo todo el código agradable y fuertemente tipado con un poco de magia expresión LINQ, pero quiero ir aún más lejos que eso y hacer algo como esto:

using ResourceMessageParamsType = object[];//<-- "Identifier expected" error here 
/*...*/ 
private ResourceMessageParamsType resourceMessageParams; 
/*...*/ 
this.resourceMessageParams = 
    (ResourceMessageParamsType)serializationInfo.GetValue(
     ReflectionHelper.GetPropertyNameFromExpression(() => 
      resourceMessageParams), typeof(ResourceMessageParamsType)); 

lugar de esto:

(object[])serializationInfo.GetValue(
    ReflectionHelper.GetPropertyNameFromExpression(() => 
     resourceMessageParams), typeof(object[])); 

para dar cabida a un posible cambio de tipo de este campo en el futuro, por lo que habrá que cambiar el tipo de una sola vez en la definición de alias. Sin embargo, el compilador se detiene en object en using ResourceMessageType = object[]; quejándose de que se espera un identificador. Cambiar a Object[] ayuda un poco, pero esta vez el corchete se resalta con el mismo mensaje de error.

¿Hay alguna manera de definir un alias para tipo de matriz en C#?

+2

Un comentario general: es redundante y, en general, mala forma de poner 'Tipo' en los nombres de sus tipos. –

Respuesta

3

En pocas palabras, no se puede "alias" tipos de matriz.

Puede solucionarlo encapsulando elementos en un struct, pero eso no responde a su pregunta.


Actualización:

Desde el estándar ECMA,

utilizando alias directiva:

using identificador de espacio de nombres = -o-tipo- nombre;

que claramente no dice nada acerca de las matrices permitidas.

(Consulte la página 100 para saber cómo se define espacio de nombres o nombre-tipo-.)

+0

Gracias por responder la pregunta. ¿Tienes un enlace de prueba? –

+0

@Stanislav: Realmente no puedes "probar" que algo no existe, a menos que consideres todas las posibilidades y las descartes. Si desea una prueba rigurosa, debe leer el [estándar ECMA] (http://www.ecma-international.org/publications/standards/Ecma-334.htm) y ver que no hay forma de hacer esto, y por lo tanto, esto es imposible ... de lo contrario, sin embargo, tendrá que "asumir mi palabra". :) – Mehrdad

+0

Sí, pensé que podría tener un párrafo específico del estándar en mente que prohíbe los tipos de arreglo de aliasing. Esperemos a que Jon Skeet responda, él conoce el estándar de memoria. –

0

Me gustaría derivar mi tipo de System.Array. Si estoy interpretando esto correctamente Lo que está describiendo es un enfoque no OO como el que usaría en el C.

Actualización: supongo que no puede subclasificar System.Array. Tal vez hay una forma de evitarlo.

+0

Bueno, puede que no sea un enfoque de OO clásico, pero hay una característica de lenguaje de aliasing type, "using MyType = SomeLongNameSpace.SomeType;" funcionaría bien, pero no para arreglos. Lo que intento hacer es proteger el código de serialización de posibles cambios en la definición de la clase. –

7

Puede definir una clase (o estructura) llamada ResourceMessageParamsType y definir operadores implícitos para el fundido desde y hacia el objeto [].

struct ResourceMessageParamsType 
{ 
    private object[] value; 

    private ResourceMessageParamsType(object[] value) 
    { 
     this.value = value; 
    } 

    public static implicit operator object[](ResourceMessageParamsType t) 
    { 
     return t.value; 
    } 

    public static implicit operator ResourceMessageParamsType(object[] value) 
    { 
     return new ResourceMessageParamsType(value); 
    } 
} 
+1

¿No estaba implícito que fuera 'explícito'? –

0
using ResourceMessageParamsType = System.Array; 

No es que yo pretendo entender cómo este "salvaguardar [s] código de serialización frente a posibles cambios en la clase definición "para ti".

Las interfaces serían un enfoque más limpio y ¿ha considerado genéricos?

Las pruebas integrales de la unidad de IMO se asegurarán de que si alguien cambia el tipo de alias, todos los códigos de deserialización sigan funcionando.

Cuestiones relacionadas