5

既存の型に動的プロキシを作成したいのですが、ターゲット型でまだ宣言されていない新しいインターフェイスの実装を追加します。これを達成する方法がわかりません。何か案は?

4

2 に答える 2

6

ProxyGenerator.CreateClassProxy()パラメータを持つのオーバーロードを使用できadditionalInterfacesToProxyます。たとえば、文字列の name プロパティを持つクラスがありIEnumerable<char>、名前の文字を列挙する をそれに追加したい場合、次のように実行できます。

public class Foo
{
    public virtual string Name { get; protected set; }

    public Foo()
    {
        Name = "Foo";
    }
}

class FooInterceptor : IInterceptor
{
    public void Intercept(IInvocation invocation)
    {
        if (invocation.Method == typeof(IEnumerable<char>).GetMethod("GetEnumerator")
            || invocation.Method == typeof(IEnumerable).GetMethod("GetEnumerator"))
            invocation.ReturnValue = ((Foo)invocation.Proxy).Name.GetEnumerator();
        else
            invocation.Proceed();
    }
}

…

var proxy = new ProxyGenerator().CreateClassProxy(
    typeof(Foo), new[] { typeof(IEnumerable<char>) }, new FooInterceptor());

Console.WriteLine(((Foo)proxy).Name);
foreach (var c in ((IEnumerable<char>)proxy))
    Console.WriteLine(c);

Nameプロキシしたくない場合は、ここでプロパティが仮想である必要はないことに注意してください。

于 2011-05-30T21:14:26.173 に答える
2

additionalInterfacesToProxy引数を受け取るプロキシの作成にオーバーロードを使用する

于 2011-05-30T21:07:49.627 に答える