DispatchProxy 代理 反射 私有方法

using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            var internalType = Assembly.Load("ClassLibrary1").GetType("ClassLibrary1.Greeter"); // 加載目標程序集
            var internalMethod = internalType.GetMethod("Greet", BindingFlags.Public|BindingFlags.Static); //加載程序集中的方法
            var proxy = GreetingFactory.Create(); //創建代理
            var result = internalMethod.Invoke(null, new[] { proxy }); 
            Console.WriteLine(result);
            Console.Read();
        }
    }

   

    public class GreetingProxy : DispatchProxy
    {
        private GreetingImp _greetingImp;

        public GreetingProxy()
        {
            _greetingImp = new GreetingImp();
        }
        protected override object Invoke(MethodInfo targetMethod, object[] args)
        {
            var v = _greetingImp.GetType().GetMethod(targetMethod.Name);
            return v.Invoke(_greetingImp, args);

        }

        public class GreetingImp
        {
            public string Message => "Hello World";
        }
    }

    public class GreetingFactory
    {

        public static object Create()
        {
            var internalType = Assembly.Load("ClassLibrary1").GetType("ClassLibrary1.IGreeting");

            return typeof(DispatchProxy)
                .GetMethod(nameof(DispatchProxy.Create))
                .MakeGenericMethod(internalType, typeof(GreetingProxy))
                .Invoke(null, null);
        }
    }
}
using System;

namespace ClassLibrary1
{
    internal class Greeter
    {
        public static void Greet(IGreeting greeting)
        {
            Console.WriteLine(greeting.Message);
            Console.WriteLine(greeting.Test());
        }

    }

    internal interface IGreeting
    {
        string Message { get; set; }

        string Test();
    }
}

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章