C#反射中的GetConstructor与GetConstructors构造函数参数的获取

C#编写代码时构造函数参数的获取需要用到反射中的GetConstructor与GetConstructors来实现,在具体使用的时候难点就在于他们的参数相对其他的反射类的内置函数要复杂一些,这里我们用代码实例的方式介绍给大家。

一、GetConstructor

GetConstructor这个函数的用法,相比GetConstructors显得更复杂,复杂就复杂在它自身的参数有些多,当仔细看清楚各种参数的功能。

1、构建一个多重载构造函数类

假定我们设计了一个类,并且设计了有个构造函数重载的RegValidator类(原本这个类是用来做正则式校验的,这里我将构造函数部分抽取出来作用实例),而且特别注意我们还为它设计了一个多参数的构造函数,如下:

  class RegValidator
    {

        private string name;
        private int inputLen;
        private bool checkState;

        public string Name{get{return name;}}
        public int InputLen { get { return inputLen; } }
        public bool CheckState { get{ return checkState; } }

        public RegValidator()
        {

        }

        public RegValidator(string str)
        {
            this.name = str;
        }

        private RegValidator(int len)
        {
            this.inputLen = len;
        }

        static RegValidator()
        {

        }

        public RegValidator(string str,int len,bool ischeck)
        {
            this.name = str;
            this.inputLen = len;
            this.checkState = ischeck;
        }
    }

2、单参数和无参数构造函数获取

我们该如何调用呢?这里的调用必须要配合type类数组,这个数字就是用来描述参数的类型的,也就是说构造函数的参数有几个参数,我们的这个数字就有多长。当然,我们如果要过滤多个重载的构造函数就必须使用BindingFlags(这个在后面会详细说)参数。下面是使用实例:

 static void Main(string[] args)
    {
        Type type = typeof(RegValidator);

        //对私有构造函数访问(单参数int类型)
        ConstructorInfo privateConstructor = type.GetConstructor(BindingFlags.Instance | BindingFlags.NonPublic,
            null, new[] { typeof(int) }, null);
        Console.WriteLine(privateConstructor.IsPrivate); //return true

        //对公有构造函数访问(单参数string类型)
        ConstructorInfo publicConstructor = type.GetConstructor(BindingFlags.Instance | BindingFlags.Public,
            null, new[] { typeof(string) }, null);
        Console.WriteLine(publicConstructor.IsPublic); //return true

        //对默认构造函数访问(无参)
        ConstructorInfo publicDefaultConstructor = type.GetConstructor(Type.EmptyTypes);
        Console.WriteLine(publicDefaultConstructor.IsPublic); //return true

        //对静态构造函数访问(无参)
        ConstructorInfo staticConstructor = type.GetConstructor(BindingFlags.Static | BindingFlags.NonPublic,
            null, new Type[] { }, null);
        Console.WriteLine(staticConstructor.IsStatic); //return true
        Console.ReadLine();
    }
}

从运行的结果看,都是正确的获取了构造函数
在这里插入图片描述

3、多参数构造函数获取

那如果是多个参数的构造函数呢?我们如何通过反射来获取构造函数的参数呢?这个就必须要对应的参数类型数组

 ConstructorInfo paras = type.GetType().GetConstructor(new Type[] {typeof(string),typeof(int),typeof(bool)});
  foreach (ParameterInfo p in paras.GetParameters())
   {
       Console.WriteLine(p.Name+s.get);
   }

4、关于参数BindingFlags

利用BindingFlags来过滤搜索构造函数的标记,下面是BindingFlags里面的常用标记的作用:
BindingFlags.Static ,搜索静态的构造函数
BindingFlags.Public,搜索公有的构造函数
BindingFlags.NonPublic,搜索中包涵非公有构造函数如(private, internal, protected ),但基类的构造函数则不返回。
这些标记用或标记“|”来叠加在一起,如:
BindingFlags bf = BindingFlags.Public
| BindingFlags.Static
| BindingFlags.NonPublic
| BindingFlags.Instance;

二、GetConstructors

1、无参重载

GetConstructors完全可以无参运行,这个无参的重载利于我们使用。但无过滤作用。

 ConstructorInfo[] cinfos = type.GetConstructors();
 
        // Display all the public instance constructors
      Type type = typeof(RegValidator);
       Console.WriteLine("All constructors are shown below");
       ConstructorInfo[] cinfos = type.GetConstructors();
            foreach(ConstructorInfo ci in cinfos)
                Console.WriteLine(ci);

输出的效果如下:
在这里插入图片描述

2、有参重载

GetConstructors也可以带参数运行,这样就可以对众多的构造函数进行过滤了。如:

 Type type = typeof(RegValidator);
 
        //利用BindingFlags来过滤搜索构造函数
        BindingFlags bf = BindingFlags.Public
                          | BindingFlags.Static
                          | BindingFlags.NonPublic
                          | BindingFlags.Instance;
 
 		 Console.WriteLine("All constructors are shown below");
         ConstructorInfo[] cinfos = type.GetConstructors(bf);
            foreach(ConstructorInfo ci in cinfos)
                Console.WriteLine(ci);
   

在这里插入图片描述

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

河西石头

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值