我有一种情况,我希望做一些类似于ASP.NET MVC 3 ViewBag对象所做的事情,其中属性是在运行时创建的?还是在编译时?
无论如何,我想知道如何用这种行为创建一个对象?
答案 0 :(得分:23)
我创造了这样的东西:
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
希望这有助于某人
答案 1 :(得分:8)
行为方面,ViewBag的行为与ExpandoObject非常相似,所以也许你想要使用它。但是,如果要执行自定义行为,则可以继承DynamicObject。 dynamic关键字在使用这些类型的对象时非常重要,它告诉编译器在运行时绑定方法调用而不是编译时,但是普通的旧clr类型的动态关键字只会避免类型检查并赢得不要给你的对象提供动态实现类型功能,这是ExpandoObject或DynamicObject的用途。
答案 2 :(得分:7)
使用dynamic
类型的对象。 See this article了解更多信息。
答案 3 :(得分:5)
ViewBag
声明如下:
dynamic ViewBag = new System.Dynamic.ExpandoObject();
答案 4 :(得分:4)
我想你想要一个匿名类型。见http://msdn.microsoft.com/en-us/library/bb397696.aspx
例如:
var me = new { Name = "Richard", Occupation = "White hacker" };
然后你可以像普通的C#
那样获得属性Console.WriteLine(me.Name + " is a " + me.Occupation);