Подтвердить что ты не робот

Создание класса, такого как ASP.NET MVC 3 ViewBag?

У меня есть ситуация, когда я хотел бы сделать что-то похожее на то, что было сделано с объектом ASP.NET MVC 3 ViewBag, где свойства создаются во время выполнения? Или это во время компиляции?

В любом случае мне было интересно, как создать объект с таким поведением?

4b9b3361

Ответ 2

Я создал что-то вроде этого:

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;
    }
}

то вы можете использовать его следующим образом:

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 ) );

обратите внимание, что запись для "JAJA" никогда не создавалась... и все еще не генерирует исключение, просто возвращает null

надеюсь, что это поможет кому-то

Ответ 3

Поведение мудрый ViewBag действует довольно много, как ExpandoObject так что, может быть, что вы хотите использовать. Однако, если вы хотите выполнять индивидуальные действия, вы можете подклассы DynamicObject. динамический ключевое слово имеет важное значение при использовании этих видов объектов в том, что он говорит компилятору, чтобы связать вызовы методов во время выполнения, а не во время компиляции, однако динамическое ключевое слово на обычном старом типе clr просто избегает проверки типов и не даст вашим объектным динамическим свойствам типа реализации, для которых предназначены ExpandoObject или DynamicObject.

Ответ 4

ViewBag объявляется следующим образом:

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

Ответ 5

Я думаю, вы хотите анонимный тип. См. http://msdn.microsoft.com/en-us/library/bb397696.aspx

Например:

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

Затем вы можете просто получить свойства, как в обычном С#

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