Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 拦截方法请求并更改参数值_C# - Fatal编程技术网

C# 拦截方法请求并更改参数值

C# 拦截方法请求并更改参数值,c#,C#,我能够创建以下示例: 可观察电子课堂 public class ObservableClass : MarshalByRefObject { public int DoSomething(int id, params string[] names) { return 1 + names.Length; } public int DoSomethingElse(int id, params string[] names) {

我能够创建以下示例:

可观察电子课堂

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();
    }
}
输出:doSomethingRes=5,doSomethingElseRes=4

这是可行的,但是经过一些研究,我相信对于我的实际应用场景来说,使用MarshalByRefObject和远程RealProxy将非常昂贵


我想知道还有什么其他的选择(轻和良好的性能),我必须作出类似的东西

是的.net远程处理非常慢。如果需要高性能的东西,可以使用动态代理


Castle Windsor支持和,这可以帮助您。

手动制作装饰器有什么用?@DiligentKeyPresser很好,因为我的想法是为每个类制作一个简单的“逻辑”,而不是为每个类制作一个装饰器,用我的“target”方法扩展一个抽象类。而且在未来,“额外”附加组件“插件”将不需要另一个“特殊”装饰类。。。。。
var temp = Interceptor.Wrap(new ObservableClass());
var doSomethingRes = temp.DoSomething(1, "a", "b", "c");
var doSomethingElseRes = temp.DoSomethingElse(1, "a", "b", "c");