2011-04-26 14 views
17

Tengo una situación en la que me gustaría hacer algo similar a lo que se hizo con el objeto ASP.NET MVC 3 ViewBag donde las propiedades se crean en tiempo de ejecución? ¿O es en tiempo de compilación?Creando una clase como ASP.NET MVC 3 ViewBag?

De todos modos, me preguntaba cómo crear un objeto con este comportamiento?

+0

posible duplicado de [? ¿Cómo puedo crear propiedades dinámicas en C#] (http://stackoverflow.com/questions/947241/how-do-i-create-dynamic-properties -in-c) – nawfal

Respuesta

4

Creo que quieres un tipo anónimo. Ver http://msdn.microsoft.com/en-us/library/bb397696.aspx

Por ejemplo:

var me = new { Name = "Richard", Occupation = "White hacker" }; 

continuación, sólo puede obtener las propiedades como en condiciones normales de C#

Console.WriteLine(me.Name + " is a " + me.Occupation); 
8

comportamiento prudente del ViewBag actúa más o menos como ExpandoObject por lo que tal vez lo que desea utilizar . Sin embargo, si desea realizar comportamientos personalizados, puede crear la subclase DynamicObject. La palabra clave dynamic es importante cuando se usa este tipo de objetos, ya que le dice al compilador que vincule las llamadas al método en tiempo de ejecución en lugar de compilar el tiempo. Sin embargo, la palabra clave dinámica en un tipo de clr simple simplemente evitará la verificación de tipos y no dará su funciones de tipo de implementación dinámica de objeto para las que son ExpandoObject u DynamicObject.

+0

Gracias por señalar 'DynamicObject'. Eso es lo que necesito y ahora me doy cuenta de 'ViewBag' 'adjunto' a' ViewData' debido a 'DynamicViewDataDictionary' – CallMeLaNN

23

creé algo como esto:

public class MyBag : DynamicObject 
{ 
    private readonly Dictionary<string, dynamic> _properties = new Dictionary<string, dynamic>(StringComparer.InvariantCultureIgnoreCase); 

    public override bool TryGetMember(GetMemberBinder binder, out dynamic result) 
    { 
     result = this._properties.ContainsKey(binder.Name) ? this._properties[ binder.Name ] : null; 

     return true; 
    } 

    public override bool TrySetMember(SetMemberBinder binder, dynamic value) 
    { 
     if(value == null) 
     { 
      if(_properties.ContainsKey(binder.Name)) 
       _properties.Remove(binder.Name); 
     } 
     else 
      _properties[ binder.Name ] = value; 

     return true; 
    } 
} 

entonces usted puede utilizar de esta manera:

dynamic bag = new MyBag(); 

bag.Apples = 4; 
bag.ApplesBrand = "some brand"; 

MessageBox.Show(string.Format("Apples: {0}, Brand: {1}, Non-Existing-Key: {2}", bag.Apples, bag.ApplesBrand, bag.JAJA)); 

nota que la entrada para "JAJA" nunca fue creado ... y todavía no lo hace lanzar una excepción, simplemente devuelve un valor nulo esperanza

esto ayuda a alguien

5

ViewBag se declara así:

dynamic ViewBag = new System.Dynamic.ExpandoObject();