2011-05-18 12 views
14

Digamos que tengo el siguiente fragmento de código:Configuración de nombre de la propiedad tipo anónimo

string SomeConst = "OtherName"; 
var persons = GetPersons(); //returns list of Person 
var q = persons.Select(p => 
new 
{ 
    SomeConst = p.Name 
}); 

Básicamente yo esperaría tener en q secuencia de tipo anónimo con la propiedad llamado otherName y no SomeConst. ¿Cómo puedo lograr tal comportamiento?

+0

¿Por qué no puede simplemente usar 'OtherName' en lugar de' SomeConst'? – SWeko

+4

Esa es la solución obvia y así es como se implementó ahora Estoy buscando una solución más genérica ahora – user759141

+0

si la ha implementado, ¿cuál es el problema? – Fermin

Respuesta

10

No puede hacer eso. Los nombres de las propiedades de un tipo anónimo deben conocerse en tiempo de compilación. ¿Por qué exactamente necesitas hacer eso?

Se puede conseguir un efecto similar mediante la creación de una secuencia de diccionarios en lugar de objetos anónimos:

string SomeConst = "OtherName"; 
var persons = GetPersons(); //returns list of Person 
var q = persons.Select(p => 
new Dictionary<string, string> 
{ 
    { SomeConst, p.Name } 
}); 
+0

Digamos que el nombre de la propiedad debe extraerse de una variable constante almacenada en algún diccionario o incluso fuera de ella. Si la variable es constante, ¿no se conoce su valor en el tiempo de compilación? – user759141

+2

No existe una "variable constante" ... Si es una constante, puede usar el nombre real directamente cuando crea el objeto anónimo. Si es una variable, no es posible, pero puede hacerlo con un diccionario como se explica en mi respuesta –

+0

Sí, el valor se conoce en tiempo de compilación, pero es una cadena, no un identificador ... –

0

La única forma en que estoy consciente de que puede agregar dinámicamente propiedades cuyo nombre es desconocido en tiempo de compilación es la ExpandoObject:

var q = persons.Select(p => { dynamic obj = new ExpandoObject(); obj.Name = p.Name; return obj; }); 

Pero realmente no veo ningún interés en hacer tal cosa. Lo más probable es que sea un diseño/idea muy mala para hacerlo. Sin dudas creará un código más incómodo, ilegible e inmanejable de lo que resolverá cualquier cosa ...

+0

este me da error de sintaxis: "expresión lambda con un cuerpo de declaración no se puede convertir en un árbol de expresión" – Star

Cuestiones relacionadas