実行時にプロパティが作成される ASP.NET MVC 3 ViewBag オブジェクトで行われたことと同様のことをしたい状況がありますか? それともコンパイル時ですか?
とにかく、この動作でオブジェクトを作成する方法を知りたいと思っていましたか?
実行時にプロパティが作成される ASP.NET MVC 3 ViewBag オブジェクトで行われたことと同様のことをしたい状況がありますか? それともコンパイル時ですか?
とにかく、この動作でオブジェクトを作成する方法を知りたいと思っていましたか?
私はこのようなものを作成しました:
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をサブクラス化できます。dynamicキーワードは、コンパイル時ではなく実行時にメソッド呼び出しをバインドするようにコンパイラに指示するという点で、これらの種類のオブジェクトを使用する場合に重要ですが、単純な古い clr 型の dynamic キーワードは型チェックを回避するだけであり、 ExpandoObject または DynamicObject の目的であるオブジェクトの動的実装タイプの機能。
タイプのオブジェクトを使用しますdynamic
。 詳細については、この記事を参照してください。
匿名型が必要だと思います。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);