17

実行時にプロパティが作成される ASP.NET MVC 3 ViewBag オブジェクトで行われたことと同様のことをしたい状況がありますか? それともコンパイル時ですか?

とにかく、この動作でオブジェクトを作成する方法を知りたいと思っていましたか?

4

5 に答える 5

24

私はこのようなものを作成しました:

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 が返されるだけです

これが誰かに役立つことを願っています

于 2013-02-10T00:09:26.693 に答える
8

動作に関しては、ViewBag は ExpandoObject とほとんど同じように機能するため、おそらく使用したいものです。ただし、カスタム動作を行いたい場合は、DynamicObjectをサブクラス化できます。dynamicキーワードは、コンパイル時ではなく実行時にメソッド呼び出しをバインドするようにコンパイラに指示するという点で、これらの種類のオブジェクトを使用する場合に重要ですが、単純な古い clr 型の dynamic キーワードは型チェックを回避するだけであり、 ExpandoObject または DynamicObject の目的であるオブジェクトの動的実装タイプの機能。

于 2011-04-27T04:58:57.870 に答える
7

タイプのオブジェクトを使用しますdynamic詳細については、この記事を参照してください。

于 2011-04-26T23:49:04.313 に答える
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);
于 2011-04-26T23:55:08.157 に答える