0
私は、次の例を作成することができました:インターセプト法の要求と変更パラメータ値
ObservableClass
public class ObservableClass : MarshalByRefObject
{
public int DoSomething(int id, params string[] names)
{
return 1 + names.Length;
}
public int DoSomethingElse(int id, params string[] names)
{
return 1 + names.Length;
}
}
インターセプタ
public class Interceptor : RealProxy
{
private readonly object _target;
public Interceptor(object target) : base(target.GetType()) { _target = target; }
public override IMessage Invoke(IMessage msg)
{
var methodCall = msg as IMethodCallMessage;
return methodCall != null ? HandleMethodCall(methodCall) : null;
}
private IMessage HandleMethodCall(IMethodCallMessage methodCall)
{
try
{
var newArgs = methodCall.InArgs;
if (methodCall.MethodName == "DoSomething")
{
for (var i = 0; i < newArgs.Length; i++)
{
if (methodCall.GetArgName(i) == "names")
{
newArgs[i] = new string[] { "a1", "a2", "a3", "a4" };
}
}
}
var result = methodCall.MethodBase.Invoke(_target, newArgs);
return new ReturnMessage(result, null, 0, methodCall.LogicalCallContext, methodCall);
}
catch (TargetInvocationException invocationException)
{
var exception = invocationException.InnerException;
return new ReturnMessage(exception, methodCall);
}
}
public static T Wrap<T>(T target) where T : MarshalByRefObject
{
return (T)new Interceptor(target).GetTransparentProxy();
}
}
そしてによってそれを呼び出す:
var temp = Interceptor.Wrap(new ObservableClass());
var doSomethingRes = temp.DoSomething(1, "a", "b", "c");
var doSomethingElseRes = temp.DoSomethingElse(1, "a", "b", "c");
出力:doSomethingRes = 5、doSomethingElseRes = 4
これは私がのMarshalByRefObjectとリモートRealProxyのの使用は私のために非常に高価になるだろうと信じているが、いくつかの研究の後、働いています実際のアプリケーションのシナリオ
他のオプション(軽量で優れたパフォーマンス)を使って、何か似たようなことをしなければならないのだろうか?
デコレータを手作業で作るのは何ですか? –
@DiligentKeyPresser私の考えは、私の "target"メソッドで抽象クラスを拡張するクラスごとにデコレータの代わりに単純な "論理"を作ることです。そして、将来、 "余分な"アドオン "プラグイン"は別の "特別な"デコレータクラスを持つ必要はありません..... – Dryadwoods