Los tipos anónimos
-
21-09-2019 - |
Pregunta
Tengo un Dictionary(TKey, TValue)
como
Dictionary<int, ArrayList> Deduction_Employees =
new Dictionary<int, ArrayList>();
y después, añadir a la lista de arreglo un tipo anónimo como esto
var day_and_type = new {
TheDay = myDay,
EntranceOrExit = isEntranceDelay
};
Deduction_Employees[Employee_ID].Add(day_and_type);
Ahora, ¿cómo puedo yo unboxing que var y acceso a esas propiedades ??
Solución
En primer lugar, usted no está unboxing del tipo. Los tipos anónimos son los tipos de referencia, no las estructuras.
A pesar de que técnicamente puede crear instancias del mismo tipo de fuera el método que se declaran en (según la sección 7.5.10.6 de la C # 3.0 Especificación del lenguaje, que establece:
En el mismo programa, dos anónimos inicializadores de objeto que especifican una secuencia de propiedades de la misma nombres y tipos en tiempo de compilación en el mismo orden producirá casos de el mismo tipo anónimo.
) que no hay manera de conseguir el Nombre del tipo, que necesita para llevar a cabo el reparto de la parte posterior Object
al tipo que ha creado. Usted tendría que recurrir a un solución fundido por ejemplo que está viciado.
moldeada por ejemplo, está viciado porque desde el punto de vista de diseño, cada lugar que desee tener acceso al tipo fuera de la función se declara (y aún dentro del mismo módulo), usted tiene que declarar de manera efectiva el tipo de nuevo .
Es una duplicación de esfuerzos que lleva a diseño e implementación descuidada.
Si está utilizando .NET 4.0, a continuación, podría colocar la instancia del objeto en una variable dinámica. Sin embargo, el principal inconveniente es la falta de verificación de tiempo de compilación de acceso miembro. Desde aquí se puede escribir mal el nombre del miembro, y entonces usted tiene un error de tiempo de ejecución en lugar de un error en tiempo de compilación.
En última instancia, si usted encuentra la necesidad de utilizar un tipo anónimo fuera del método se declara en, entonces la única buena solución es crear un tipo concreto y sustituir el tipo anónimo para el tipo concreto .
Otros consejos
Hay varias maneras.
Dado que los comentarios parece indicar que le sugiero que hacer esto, quiero dejar claro:. Debe ser la creación de un tipo llamado para su objeto, ya que la intención de pasarlo alrededor
En primer lugar, se puede utilizar la reflexión, que otra respuesta aquí ya se ha señalado.
Otra forma, que trucos en .NET que le da el tipo que se conoce como "fundido con el ejemplo", y que es algo como esto: Usted necesita para aprobar el objeto a través de una llamada al método genérico, que devolverá el objeto como el tipo correcto, infiriendo el tipo de cambio.
Por ejemplo, intente lo siguiente:
private static T CastByExample<T>(T example, object value)
{
return (T)value;
}
y utilizarlo:
var x = CastByExample(new { TheDay = ??, EntranceOrExit = ?? }, obj);
para los dos ?? manchas, sólo tiene que pasar algo de montar el tipo de datos para esas propiedades, no se utilizarán los valores.
Esta explota el hecho de que varios tipos anónimos que contiene los exacta mismas propiedades, del mismo tipo, en el mismo orden, en el mismo conjunto, se asignarán al mismo tipo único.
Sin embargo, a estas alturas ya debe ser la creación de un tipo llamado en su lugar.
tipo Un anónimo tiene alcance método. Para pasar un tipo anónimo, o una colección que contiene los tipos anónimos, fuera de un límite método, primero debe convertir el tipo de objeto. Sin embargo, esta derrota el tipado fuerte del tipo anónimo. Si debe almacenar resultados de la consulta o pasarlos fuera del límite del método, considerar el uso de una estructura que se llama ordinario o clase en lugar de un tipo anónimo.
Fuente: http://msdn.microsoft.com/en-us /library/bb397696.aspx
No, no puede. Sólo se puede acceder a las propiedades mediante el uso de la reflexión. El compilador no tiene forma de saber cuál era el tipo, y ya que es un tipo anónimo, no se puede echar tampoco.
Si está utilizando .NET 1.x -. 3.x, debe utilizar la reflexión
Si utiliza .NET 4.0, se puede utilizar un tipo dinámico y llamar a las propiedades esperadas.
En ninguno de los casos hacen lo necesario para unbox; eso es para los tipos de valor. Los tipos anónimos son siempre los tipos de referencia.