2

Castle DynamicProxy2を使用して、ディクショナリからフィールドを取得するためのインターフェイスを「タックオン」しています。たとえば、次のクラスがあるとします。

public class DataContainer : IDataContainer
{
    private Dictionary<string, object> _Fields = null;

    public Dictionary<string, object> Data
    {
        get { return _Fields ?? (_Fields = new Dictionary<string, object>()); }
    }
}

次のインターフェイスをインターフェイスプロキシとして使用して、Fieldsディクショナリから「Name」値を抽出したいと思います。

public interface IContrivedExample
{
    string Name { get; }
}

インターセプターから、「ターゲット」DataContainerを取得し、「Name」値を返します。

public void Intercept(IInvocation invocation)
{
    object fieldName = omitted; // get field name based on invocation information

    DataContainer container = ???; // this is what I'm trying to figure out
    invocation.ReturnValue = container.Fields[fieldName];
}

// Somewhere in code
var c = new DataContainer();
c.Fields.Add("Name", "Jordan");

var pg = new ProxyGenerator();
IContrivedExample ice = (IContrivedExample) pg.CreateInterfaceProxyWithTarget(..., c, ...);
Debug.Assert(ice.Name == "Jordan");

根底にあるターゲットを取得する方法についての考え

注:これは、私が持っている質問の前後関係を確立するために使用している不自然な例です。

4

2 に答える 2

3

私はそれを考え出した。プロキシをIProxyTargetAccessorにキャストする必要があります。

public void Intercept(IInvocation invocation)
{
    object fieldName = omitted; // get field name based on invocation information

    var accessor = invocation.Proxy as IProxyTargetAccessor;

    DataContainer container = (DataContainer) accessor.DynProxyGetTarget();
    invocation.ReturnValue = container.Fields[fieldName];
}
于 2009-05-05T20:12:22.567 に答える
1

なぜ面倒なのですか?

使用する

var container = invocation.InvocationTarget as DataContainer;

ところで、IIUC、あなたはCastleDictionaryAdapterによってすでに提供されているものを実装しようとしています。すでに出回っているものを使ってみませんか?

于 2009-05-13T10:45:57.487 に答える