3

.NET3.5で動作する単純なDynamicObjectの例を取得するのに苦労しています。

コードプレックスから離れたDLRの最新ビルドを使用して、以下に相当する.NET3.5が何であるかを理解できませんでした。

public class DynamicObjectBag : DynamicObject
{
    private Dictionary<string, object> _properties = new Dictionary<string, object>();
    public override bool TryGetMember(GetMemberBinder binder, out object result)
    {
        return _properties.TryGetValue(binder.Name, out result);
    }

    public override bool TrySetMember(SetMemberBinder binder, object value)
    {
        _properties[binder.Name] = value;
        return true;
    }
}

dynamic foo = new DynamicObjectBag();
foo.Val1 = 3;
foo.Val2 = “Value 2”;

もちろん、これは単純化された例です。DynamicObjectからクラスを派生させる予定なので、直接オブジェクトプロパティと、同じセマンティックドットスタイル表記またはアクセスメソッドを使用してディクショナリに格納されているプロパティの両方を使用できます。目標は、DLRがサポートされる言語で使用するためのDLR互換オブジェクトを用意し、アプリケーションを.NET 4.0にアップグレードできる場合に、.NET4.0DLR機能との将来の互換性を提供することです。

私の問題は、.NET4.0より前の動的キーワードに相当する概念がないことです。TryGetMemberなどのメソッドには、GetMemberBinderなどのバインダーパラメーターがあります。現在、.NET 4.0にはC#のデフォルトのバインダーがあり、dynamicキーワードを使用するとバインディングを実行できますが、.NET3.5で同等の機能を実行する方法を見つけることも決定することもできません。

現時点では、.NET 4.0のデフォルトのC#バインダーで使用可能なロジックのタイプを基本的に複製するカスタムバインダーを作成する必要があることを理解しています。

誰かが私に.NET3.5でDynamicObjectを使用し、動的キーワードにアクセスせずに実行時にプロパティなどを追加する方法について正しい方向を示してください。

参照:
動的オブジェクトへのメンバーの動的な追加
http://tomlev2.wordpress.com/2009/10/08/c-4-0-implementing-a-custom-dynamic-object/

4

1 に答える 1

2

カスタムバインダーを作成する必要があります。その後、アクションがキャッシュされるように、CallSiteを使用してバインダーを使用することをお勧めします。

外側のレイヤーでDefaultBinderを使用して、これのほとんどを実行できます。作成するだけで、GetMemberなどのメソッドを使用してバインディングを実行できます。バインダーの実装は、DefaultBinderを使用し、戻ってくるボクシングの値型にルールを適用するだけです(DLRではすべての戻り型がオブジェクトである必要があります)。

于 2010-02-25T20:28:29.687 に答える