C# 反射-不需要接口约束,调用各种方法

反射优缺点

优点:动态

缺点:

1、避开编译器检查,在有错误的情况下,在编译的时候不会报错,只有运行的时候才会报错

2、用起来不只管,不方便

3、性能有损失


调用实例方法


创建一个实例方法

namespace DoSomeThing
{
    public class Funtions
    {
        public void ShiLi()
        {
            Console.WriteLine("调用了一个实例方法");
        }
    }
}
调用

Console.WriteLine("**************调用实例方法*****************");
                Assembly assembly = Assembly.Load("DoSomeThing");
                Type type = assembly.GetType("DoSomeThing.Funtions");
                Object obj = Activator.CreateInstance(type);
                MethodInfo method = type.GetMethod("ShiLi");
                method.Invoke(obj,null);
结果



调用有参数的实例方法


创建一个有参数的实例方法

namespace DoSomeThing
{
    public class Funtions
    {
        public void ShiLi(string name,int id)
        {
            Console.WriteLine("调用了一个实例方法,并传递参数name={0},id={1}",name,id);
        }
    }
}
调用

 Console.WriteLine("**************调用有参数的实例方法*****************");
                //引用dll
                Assembly assembly = Assembly.Load("DoSomeThing");
                //获取类型
                Type type = assembly.GetType("DoSomeThing.Funtions");
                //创建对象
                Object obj = Activator.CreateInstance(type);
                //获取方法
                MethodInfo method=type.GetMethod("ShiLi");
                //执行方法 注意 这里传入的参数 类型和顺序要正确
                method.Invoke(obj, new object[] { "黑猫警长",1});
结果


调用静态方法


创建一个静态方法

namespace DoSomeThing
{
    public class Funtions
    {
        public static void ShiLi(string name,int id)
        {
            Console.WriteLine("调用了一个静态实例方法,并传递参数name={0},id={1}",name,id);
        }
    }
}

调用

 Console.WriteLine("**************调用静态方法*****************");
                //调用dll
                Assembly assembly = Assembly.Load("DoSomeThing");
                //获取类型
                Type type = assembly.GetType("DoSomeThing.Funtions");
                //获取方法
                MethodInfo method = type.GetMethod("ShiLi");
                //因为静态方法调用 不需要创建对象 所以前面传入null
                method.Invoke(null,new object[]{"静态方法",22});

结果



重载方法的调用


重载方法

namespace DoSomeThing
{
    public class ChongZai
    {
        public void Say()
        {
            Console.WriteLine("大家好");
        }

        public void Say(string name)
        {
            Console.WriteLine("大家好,我是{0}",name);
        }

        public void Say(int id)
        {
            Console.WriteLine("大家好,我是{0}号选手",id);
        }

        public void Say(string name,int id)
        {
            Console.WriteLine("大家好我是{0}号选手,我的名字是:{1}",id,name);
        }
    }
}

调用

Console.WriteLine("**************重载方法的调用*****************");
                //读取dll
                Assembly assembly = Assembly.Load("DoSomeThing");
                //获取类型
                Type type = assembly.GetType("DoSomeThing.ChongZai");
                //创建对象
                Object obj = Activator.CreateInstance(type);
                //创建方法
                MethodInfo method = type.GetMethod("Say",new Type[]{});
                //调用
                Console.WriteLine("调用0参数方法");
                method.Invoke(obj, null);
                Console.WriteLine("调用1-String参数方法");
                MethodInfo method1 = type.GetMethod("Say",new Type[]{typeof(string)});
                method1.Invoke(obj, new object[] { "卡卡西" });
                Console.WriteLine("调用1-Int参数方法");
                MethodInfo method2 = type.GetMethod("Say",new Type[]{typeof(int)});
                method2.Invoke(obj, new object[] { 11 });
                MethodInfo method3 = type.GetMethod("Say",new Type[]{typeof(string),typeof(int)});
                Console.WriteLine("调用2参数方法");
                method3.Invoke(obj, new object[] { "卡卡西", 11 });


结果



调用私有方法


创建一个私有方法

namespace DoSomeThing
{
    public class PrivateClass
    {
        private void GetPrivate()
        {
            Console.WriteLine("这是一个私有方法");
        }
    }
}
调用

 Console.WriteLine("**************私有方法的调用*****************");
                //引用dll
                Assembly assembly = Assembly.Load("DoSomeThing");
                //获取类型
                Type type = assembly.GetType("DoSomeThing.PrivateClass");
                //创建对象
                Object obj = Activator.CreateInstance(type);
                //获取私有方法
                MethodInfo method = type.GetMethod("GetPrivate", BindingFlags.Instance | BindingFlags.NonPublic);
                method.Invoke(obj,null);
结果



泛型方法

泛型类

namespace DoSomeThing
{
    public class GenericClass
    {      
        public void GenericFun<T>(T t)
        {
            Console.WriteLine("泛型参数类型是:{0},参数值为:{1}",typeof(T),t);
        }

    }
}
调用

 Console.WriteLine("**************泛型方法的调用*****************");
               //调用dll
                Assembly assembly = Assembly.Load("DoSomeThing");
                //获取类型
                Type type = assembly.GetType("DoSomeThing.GenericClass");
                //创建对象
                Object obj = Activator.CreateInstance(type);
                //获取方法
                MethodInfo method = type.GetMethod("GenericFun");
                method = method.MakeGenericMethod(typeof(string));
                method.Invoke(obj,new object[]{"姓名"});
结果

需要注意的是,泛型方法和泛型类不一样 它不需要写 `N (图片中应该是泛型方法的调用,后来代码里面改了 结果图片就不换了 莫纠结)


获取属性和字段

namespace DoSomeThing
{
    public class People
    {
        public string _Value;
        private int _Age;

        public int Id { get; set; }
        private string Name { get; set; }

    }
}

调用

 Console.WriteLine("**************属性和字段的获取*****************");
               //调用dll
                Assembly assembly = Assembly.Load("DoSomeThing");
                //获取类型
                Type type = assembly.GetType("DoSomeThing.People");
                //获取字段
                foreach (var item in type.GetFields(BindingFlags.Instance|BindingFlags.Public|BindingFlags.NonPublic))
                {
                    Console.WriteLine(item.Name);
                }
		//获取属性
                foreach (var item in type.GetProperties(BindingFlags.Instance|BindingFlags.Public|BindingFlags.NonPublic))
                {
                    Console.WriteLine(item.Name);
                }

结果:


如果不需要查找私有字段和属性 可以不加
BindingFlags.Instance|BindingFlags.Public|BindingFlags.NonPublic
这段代码

字段的查询+赋值+读取

 Console.WriteLine("**************字段的获取+赋值+读取*****************");
               //调用dll
                Assembly assembly = Assembly.Load("DoSomeThing");
                //获取类型
                Type type = assembly.GetType("DoSomeThing.People");
                //创建对象
                Object obj = Activator.CreateInstance(type);
                //查询字段并赋值
                foreach (var file in type.GetFields(BindingFlags.Instance|BindingFlags.Public|BindingFlags.NonPublic))
                {
                    if (file.Name.Equals("_Age"))
                    {
                        file.SetValue(obj,11);
                    }
                    else if (file.Name.Equals("_Value"))
                    {
                        file.SetValue(obj,"奥特曼");
                    }
                }
                //读取
                foreach (var file in type.GetFields(BindingFlags.Instance|BindingFlags.Public|BindingFlags.NonPublic))
                {
                    Console.WriteLine(file.GetValue(obj));
                }


属性的查询+赋值+读取

 Console.WriteLine("**************属性的获取+赋值+读取*****************");
               //调用dll
                Assembly assembly = Assembly.Load("DoSomeThing");
                //获取类型
                Type type = assembly.GetType("DoSomeThing.People");
                //创建对象
                Object obj = Activator.CreateInstance(type);
                //获取并赋值
                foreach (var prop in type.GetProperties(BindingFlags.Instance|BindingFlags.Public|BindingFlags.NonPublic))
                {
                    if (prop.Name.Equals("Id"))
                    {
                        prop.SetValue(obj, 11, null);                        
                    }
                    else if (prop.Name.Equals("Name"))
                    {
                        prop.SetValue(obj, "奥特曼",null);
                    }
                }

                foreach (var prop in type.GetProperties(BindingFlags.Instance|BindingFlags.Public|BindingFlags.NonPublic))
                {
                    Console.WriteLine(prop.GetValue(obj,null));
                }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值