.net简单反射样例源代码


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

namespace ConsoleApp1
{
    class TestClass
    {
        public string TestFunc(string z, string b, string c)
        {
            return $"z is {z};b is {b};c is {c};";
        }
    }
    class Program
    {
        static void Main(string[] args)
        {

            var assembly = typeof(test111).Assembly;
            var instance = assembly.CreateInstance("ConsoleApp1.TestClass");
            var mod = instance.GetType().GetMethod("TestFunc");
            List<string> names = mod.GetParameters().Select(f => f.Name).ToList();

            List<object> parameters = new List<object>();
            foreach (var item in names)
            {
                parameters.Add(item);
            }

            Console.WriteLine($"{mod.Invoke(instance, parameters.ToArray())}");
            Console.ReadKey();
            return;
        }
    }
}

 /// <summary>
        /// 得到插件中实现接口的实例<T>是某接口 
        /// </summary>
        /// <param name="pDllpath">实现了接口的dll完整路径和文件名</param>
        /// <returns></returns>
        public static T GetAssemblyLkf<T>(string pDllpath)
        {
            T MyInstance = default(T);
            Assembly asm = null;
            try
            {
                asm = Assembly.LoadFile(pDllpath);
            }
            catch (BadImageFormatException ex)
            {
                return MyInstance;
            }

            Type[] types = asm.GetExportedTypes();
            foreach (Type type in types)
            {
                Type typeInstance = typeof(T);
                //判断遍历的类型是否实现了T接口,以前用as 转换为接口,判断是否为空
                if (typeInstance.IsAssignableFrom(type) && !type.IsAbstract)
                {
                    MyInstance = (T)Activator.CreateInstance(type);
                }
            }
            return MyInstance;
        }

/// <summary>
        /// 全局通用反射示例
        /// </summary>
        /// <param name="assemblyName">项目名称</param>
        /// <param name="className">类名称</param>
        /// <param name="methodName">函数名称</param>
        /// <param name="parms">参数</param>
        /// <returns></returns>
        public static Object GetClassMethodReturnResult(string assemblyName, string className, string methodName, Object[] parms)
        {
            Assembly ass = Assembly.Load(assemblyName);
            Type[] types = ass.GetTypes();
            object result = null;
            foreach (Type item in types)
            {
                if (item.Name.Equals(className))
                {
                    try
                    {
                        if (parms != null && parms.Length > 0)
                        {

                            object obj = Activator.CreateInstance(item);
                            Type[] types1=new Type[parms.Length];
                            for (int i = 0; i < parms.Length; i++)
                            {
                                types1[i] = parms[i].GetType();
                            }
                            MethodInfo[] methods = item.GetMethods();
                            foreach (var mm in methods)
                            {
                                if (mm.Name == methodName)
                                {
                                    if(mm.GetParameters().Length==parms.Length)
                                        result = mm.Invoke(obj, parms);
                                }
                            }
                           
                        }
                        else
                        {
                            object obj = Activator.CreateInstance(item);
                            MethodInfo m = item.GetMethod(methodName,new Type[]{});
                            result = m.Invoke(obj, parms);
                        }
                    }
                    catch (Exception e)
                    {
                        throw e;
                    }
                }
            }
            return result;
        }


调用示例
 object[] o = new object[] {
          IdenCard.Text.Trim(),table
            };
                bool IsExist = (bool)Reflaction.GetClassMethodReturnResult("BizProcess", "AuthorizationRecordBiz", "ExistAuthorizationByIden", o);

顺手放几个github上的库解救被动态代理和动态反射困扰的各位。CoreProxy  --动态代理dynamitey --动态反射能干什么就小蜜蜂论坛发帖机看你需要干什么了。


            Stream stream = new FileStream("net同版本.exe", FileMode.Open);
            byte[] bt = new byte[stream.Length];
            stream.Read(bt, 0, (int)stream.Length);
            stream.Close();

 

发布了74 篇原创文章 · 获赞 0 · 访问量 3072

猜你喜欢

转载自blog.csdn.net/netyou/article/details/104589685