objetos - que es un objeto en c#
Repartir lista de tipo anĂ³nimo a lista de objetos dinĂ¡micos (2)
¿Por qué no puedo lanzar una List<AnonymousObject>
a una List<dynamic>
? Tengo este siguiente código:
var datasource = someList.Select(o => new { x = o.A, y = o.B });
dgvSomeGridView.DataSource = datasource.ToList();
dgvSomeGridView.DataBind();
Luego GridView.DataSource
a GridView.DataSource
con el siguiente código:
var ds = ((List<dynamic>)dgvSomeGridView.DataSource);
....
Pero arroja un error en la línea donde lo lanzo a la List<dynamic>
, dice:
No se puede convertir objeto de tipo
System.Collections.Generic.List''1[<>f__AnonymousType0''8[System.Int32,System.String]]
para escribirSystem.Collections.Generic.List''1[System.Object]
.
¿Por qué no puedo convertir una lista de tipo anónimo en una dynamic
, o como dice el error en un tipo de object
? ¿Cómo puedo resolver esto?
Mi código está en C #, framework 4.0, compilado en VS2010 Pro, la plataforma es ASP.NET.
Por favor ayuda, gracias de antemano.
En primer lugar, Casting con genérico no funciona de esa manera. Este elenco no es válido:
List<string> source = GetStrings();
List<object> source2 = (List<object>) source;
La razón es que la lista no es co-variante. Si lo fuera, podría source2.Add(source2);
y, de repente, source1 se contiene a sí mismo cuando solo debería tener cadenas.
En segundo lugar, los tipos anónimos son solo clases declaradas por el compilador con propiedades de solo lectura y semántica de igualdad de valores. Si creó una clase con propiedades de solo lectura y semántica de igualdad de valores, su clase sería igual a un tipo anónimo, excepto que su tipo tendría un nombre determinado por el desarrollador, mientras que el tipo anónimo tiene un nombre determinado por el compilador. Los tipos de anon no son especiales.
En tercer lugar, dynamic variables dynamic son una manera de ir alrededor de la verificación de tipo de compilador. Ellos no van alrededor de la comprobación de tipo de tiempo de ejecución. Puede usar la sintaxis de conversión de c # para convertir explícitamente el tipo a dinámico ... nota: ¡esto no es una conversión! No puede realizar una conversión de tiempo de ejecución a un tipo que no existe en tiempo de ejecución.
Sin embargo, las operaciones que contienen expresiones de tipo dinámico no se resuelven o el compilador verifica el tipo. El compilador agrupa información sobre la operación, y esa información se usa más adelante para evaluar la operación en tiempo de ejecución. Como parte del proceso, las variables de tipo dinámico se compilan en variables de tipo objeto. Por lo tanto, el tipo dinámico existe solo en tiempo de compilación, no en tiempo de ejecución.
static void convertToDynamic()
{
dynamic d;
int i = 20;
d = (dynamic)i;
Console.WriteLine(d);
string s = "Example string.";
d = (dynamic)s;
Console.WriteLine(d);
DateTime dt = DateTime.Today;
d = (dynamic)dt;
Console.WriteLine(d);
}
// Results:
// 20
// Example string.
// 2/17/2009 9:12:00 AM
Finalmente, si aún desea una List<dynamic>
, haga esto:
var anonList = GetAnonList();
List<dynamic> dynamicList = anonList.Select(x => (dynamic)x).ToList();
Pero puedes hacer esto fácilmente
var anonList = GetAnonList();
List<object> objectList = anonList.Cast<object>().ToList();
Ya que List<T>
es in-variant, no co-variant, así que debes convertirlo en IEnumerable<dynamic>
que admite co-variant:
var ds = ((IEnumerable<dynamic>)dgvSomeGridView.DataSource).ToList();
Para más información sobre covariante.