2009-10-29 11 views
10

¿Hay alguna manera de establecer dinámicamente el nombre de propiedad de un tipo anónimo?Establezca dinámicamente el nombre de propiedad de un tipo anónimo de C#

Normalmente nos gustaría hacer la siguiente manera:

var anon = new { name = "Kayes" }; 

Ahora me gustaría establecer el nombre (o identificador) de la propiedad de forma dinámica, por lo que este nombre puede venir de un archivo XML o una base de datos .


Gracias a todos por sus respuestas. No, mi necesidad definitivamente no vale todas las alternativas tediosas. Solo quería que mi código cumpliera con una biblioteca existente desarrollada por mi jefe de equipo. Pero decidimos actualizar la biblioteca para que sea compatible con los tipos de diccionario para que se pueda resolver fácilmente.

Pete, estoy muy emocionado de aprender acerca de los tipos dinámicos en .NET 4.0

, gracias.

+0

Para las versiones más recientes de C# ver: http://stackoverflow.com/questions/3740021/how -to-dynamic-new-anonymous-class – nawfal

Respuesta

2
No

sin una cantidad masiva de reflexión, probablemente más que para las que tiene interés en aprovechar de lo que está haciendo. Tal vez debería considerar usar un Diccionario, cuyo valor clave sea el nombre de la propiedad.

0

El compilador debe saber sobre el nombre de la propiedad, de lo contrario no se puede crear el tipo anónimo para usted.

Por lo tanto, no, esto no es posible, a menos que el nombre de la propiedad real es conocido en tiempo de compilación (a través de un poco de magia generada-VS con la base de datos o algo así).

3

Eso no es posible, porque a pesar de que el tipo es anónima, que no es un tipo dinámico. Todavía es un tipo estático, y las propiedades al respecto deben conocerse en tiempo de compilación.

Es posible que desee echa un vistazo a la palabra clave .NET 4.0 "dinámico" para generar verdaderas clases dinámicas.

0

Las propiedades dinámicas se pueden hacer con compiling code at runtime pero esto sería una exageración para sus necesidades supongo ...

0

Nop. Desea construir una estructura estática a partir de información dinámica. No funcionará, piénselo. Use un diccionario para su caso.

1

Como se ha mencionado, no se puede cambiar el nombre de la propiedad; ¿Cómo codificarías contra eso, por ejemplo? Sin embargo, si esto es para el enlace de datos, puede hacer algunos trucos para doblar el nombre para mostrar de las propiedades en tiempo de ejecución, por ejemplo ICustomTypeDescriptor/TypeDescriptionProvider (y un PropertyDescriptor personalizado).

Mucho trabajo; Tendría que realmente la pena ...

Otra opción es un atributo personalizado:

using System; 
using System.ComponentModel; 
using System.Windows.Forms; 
class MyDisplayNameAttribute : DisplayNameAttribute { 
    public MyDisplayNameAttribute(string value) : base(value) {} 
    public override string DisplayName { 
     get { 
      return @"/// " + base.DisplayNameValue + @" \\\"; 
     } 
    } 
} 
class Foo { 
    [MyDisplayName("blip")] 
    public string Bar { get; set; } 
    [STAThread] 
    static void Main() { 
     Application.EnableVisualStyles(); 
     using (Form form = new Form { 
      Controls = { 
       new PropertyGrid { 
        Dock = DockStyle.Fill, 
        SelectedObject = new Foo { Bar = "abc"}} 
      } 
     }) { 
      Application.Run(form); 
     } 
    } 
} 
Cuestiones relacionadas