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 ??

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top