Ответ 1
Используйте объект типа dynamic
. Подробнее см. в этой статье.
У меня есть ситуация, когда я хотел бы сделать что-то похожее на то, что было сделано с объектом ASP.NET MVC 3 ViewBag, где свойства создаются во время выполнения? Или это во время компиляции?
В любом случае мне было интересно, как создать объект с таким поведением?
Используйте объект типа dynamic
. Подробнее см. в этой статье.
Я создал что-то вроде этого:
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
надеюсь, что это поможет кому-то
Поведение мудрый ViewBag действует довольно много, как ExpandoObject так что, может быть, что вы хотите использовать. Однако, если вы хотите выполнять индивидуальные действия, вы можете подклассы DynamicObject. динамический ключевое слово имеет важное значение при использовании этих видов объектов в том, что он говорит компилятору, чтобы связать вызовы методов во время выполнения, а не во время компиляции, однако динамическое ключевое слово на обычном старом типе clr просто избегает проверки типов и не даст вашим объектным динамическим свойствам типа реализации, для которых предназначены ExpandoObject или DynamicObject.
ViewBag
объявляется следующим образом:
dynamic ViewBag = new System.Dynamic.ExpandoObject();
Я думаю, вы хотите анонимный тип. См. 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);