• 【转载】.net 动态代理


    using System;
    using System.Collections.Generic;
    using System.Runtime.Remoting;
    using System.Runtime.Remoting.Messaging;
    using System.Runtime.Remoting.Proxies;
    
    namespace DynamicProxy.Core
    {
        /// <summary>
        /// 代理工厂
        /// </summary>
        /// <typeparam name="T"></typeparam>
        public class ProxyFactory<T>
        {
            public static T Create(T obj, Dictionary<string, DynamicAction> proxyMethods = null)
            {
                var proxy = new DynamicProxy<T>(obj) { ProxyMethods = proxyMethods };
    
                return (T)proxy.GetTransparentProxy();
            }
        }
    
    
        /// <summary>
        /// 动态代理类
        /// </summary>
        /// <typeparam name="T"></typeparam>
        public class DynamicProxy<T> : RealProxy
        {
            private readonly T _targetInstance = default(T);
    
            public Dictionary<string, DynamicAction> ProxyMethods { get; set; }
    
            public DynamicProxy(T targetInstance)
                : base(typeof(T))
            {
                _targetInstance = targetInstance;
            }
            public override IMessage Invoke(IMessage msg)
            {
                var reqMsg = msg as IMethodCallMessage;
    
                if (reqMsg == null)
                {
                    return new ReturnMessage(new Exception("调用失败!"), null);
                }
    
                var target = _targetInstance as MarshalByRefObject;
    
                if (target == null)
                {
                    return new ReturnMessage(new Exception("调用失败!请把目标对象 继承自 System.MarshalByRefObject"), reqMsg);
                }
    
                var methodName = reqMsg.MethodName;
    
                DynamicAction actions = null;
    
                if (ProxyMethods != null && ProxyMethods.ContainsKey(methodName))
                {
                    actions = ProxyMethods[methodName];
                }
    
                if (actions != null && actions.BeforeAction != null)
                {
                    actions.BeforeAction();
                }
    
                var result = RemotingServices.ExecuteMessage(target, reqMsg);
    
                if (actions != null && actions.AfterAction != null)
                {
                    actions.AfterAction();
                }
    
                return result;
            }
        }
    
    
        /// <summary>
        /// 动态代理要执行的方法
        /// </summary>
        public class DynamicAction
        {
            /// <summary>
            /// 执行目标方法前执行
            /// </summary>
            public Action BeforeAction { get; set; }
    
            /// <summary>
            /// 执行目标方法后执行
            /// </summary>
            public Action AfterAction { get; set; }
        }
    
    }
    public class User : MarshalByRefObject
        {
            public int Age { get; set; }
    
            public string Name { get; set; }
    
            public bool Add(string name,int age ,out int count)
            {
                Name =name;
    
                Age = age;
    
                count = 1;
    
                Console.WriteLine("Add " + Name+" ...");
    
                return true;
            }
    
            public string SayName()
            {
    
                Console.WriteLine("My name is "+Name);
    
                return Name;
            }
    
        }
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using DynamicProxy.Core;
    
    namespace DynamicProxy.Demo
    {
        class Program
        {
            static void Main(string[] args)
            {
    
                var proxyMotheds = new Dictionary<string, DynamicAction>();
    
                // key is  Proxy's methodName, value is Actions
                proxyMotheds.Add("Add", new DynamicAction()
                {
                    BeforeAction = new Action(() => Console.WriteLine("Before Doing....")),
                    AfterAction = new Action(() => Console.WriteLine("After Doing...."))
                });
    
                var user = new User();
                //proxy for User
                var t = ProxyFactory<User>.Create(user, proxyMotheds);
    
                int count = 0;
    
                t.Add("Tom", 28, out count);
    
                t.SayName();
    
                Console.WriteLine(count);
                Console.Read();
    
    
            }
        }
    }

    原文链接: https://www.cnblogs.com/red-fox/p/5443680.html

  • 相关阅读:
    合并两个有序数组
    删除排序数组中的重复项 II
    对称二叉树
    相同的树
    二叉树的最大深度
    从前序与中序遍历序列构造二叉树
    vue简单案例_动态添加删除用户数据
    对vue的初步学习(一)
    关于java for循环常见练习题
    关于java中循环的学习
  • 原文地址:https://www.cnblogs.com/lianjinzhe/p/10323730.html
Copyright © 2020-2023  润新知