2

ライブラリに渡され、さまざまなプロセスを経たオブジェクトがあります。これらのオブジェクトがさまざまな段階を通過して反対側に出るときに、これらのオブジェクトにいくつかの追加情報を添付する必要があります。既存の動作を変更するのではなく、追加のプロパティを追加することを除いて、一種の動的デコレータ パターンだと思います。

LinFu または Castle を使用して動的プロキシを作成し、オブジェクトに追加のインターフェイスを実装してこれを保存することを望んでいました。拡張インターフェイスを認識しているコンポーネントは、それをキャストしてアクセスできますが、そうでないコンポーネントは、基になる型が変更されていないため、認識されていません。

しかし、これらすべてのメカニズムが、型が最初に作成される時点を制御できると想定していることを認識していませんでした。

これにもっとうまくアプローチする方法について誰か提案がありますか?

どうもありがとう

4

3 に答える 3

0

これはあなたのシナリオを正確に扱っているわけではありませんが、オブジェクトの周りのデコレータとして機能する DynamicObject 実装を使用するのはどうですか? 元のオブジェクトと追加のプロパティにアクセスできます。ExpandoObject に似ていますが、独自のインスタンス データから始めます。

このようなもの:

public class Expando : DynamicObject
{
    public dynamic Instance;
    Dictionary<string, dynamic> ExtraProperties = new Dictionary<string, dynamic>();

    public Expando(object instance)
    {
        Instance = instance;
    }

    public override bool TryGetMember(GetMemberBinder binder, out object result)
    {
        try
        {
            result = ReflectionUtils.GetProperty(Instance, binder.Name);
            return true;
        }
        catch
        {
            if (ExtraProperties.Keys.Contains(binder.Name))
            {
                result = ExtraProperties[binder.Name];
                return true;
            }
        }

        result = null;
        return false;
    }

    public override bool TrySetMember(SetMemberBinder binder, object value)
    {
        try
        {
            ReflectionUtils.SetProperty(Instance, binder.Name, value);
        }
        catch (Exception ex)
        {
            ExtraProperties[binder.Name] = value;
        }

        return true;
    }

    public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result)
    {
        try
        {
            result = ReflectionUtils.CallMethod(Instance, binder.Name, args);
            return true;
        }
        catch
        {}

        result = null;
        return false;
    }
}

残念ながら、強力なタイピング/インターフェイスの要件には対応していません。また、ここでのリフレクションの使用を考えると、パフォーマンスが最大になることはありません ( https://github.com/RickStrahl/Westwind.Utilities/blob/master/Westwind.ユーティリティ/ユーティリティ/ReflectionUtils.cs )

于 2011-11-16T21:32:02.433 に答える
0

やり過ぎのようです...「余分な」プロパティだけを含む新しいクラスを作成するだけです。static を定義しますDictionary<MainClass,ExtensionsClass>。コンポーネントが「知っている」場合、オブジェクトの拡張プロパティを調べたい場合は、そのオブジェクトをディクショナリで検索するだけです。

于 2011-11-16T21:38:26.900 に答える