C#高级编程——通过反射来获取类的构造函数

反射:反射是.NET中的重要机制,通过反射,可以在运行时获得程序或程序集中每一个类型(包括类、结>构、委托、接口和枚举等)的成员和成员的信息。

其实讲道理在讲这个之前应该先用一个博客来讲一下反射的,但是讲道理我现在也不太明白反射到底是怎么一回事,只知道他可以在运行时用来查看类型的内部属性。想详细了解反射的话,可以参考这篇别人家的博客:详解C#中的反射。

首先,假设我们有下面这样一个测试类:

    class Test
    {
        private MyClass(){}

        public MyClass(int i){}

        static MyClass(){}  
    }

现在我们有一个需求,就是获取到这里面的构造函数,那我们应该怎么办呢,这时候,就需要用到 Type 类的这个方法:GetConstructors() 或 GetConstructors (BindingFlags flags);

GetConstructors():获取当前类型中定义的所有公共的构造函数。
GetConstructors (BindingFlags flags):当构造函数在派生类中被重写时,使用指定的bindingflags,搜索当前类型的构造函数。

第一个没什么好讲的,我们来仔细讲讲第二个方法。

首先我们来介绍下BindingFlags,这是一个枚举类型,在这里,我们可能需要的有下面四种:

  • BindingFlags.Public : 指定公开成员将被包含在搜索中
  • BindingFlags.Static :指定静态成员将被包含在搜索中
  • BindingFlags.NonPublic:指定非公开成员将被包含在搜索中
  • BindingFlags.Instance :指定实例成员将被包含在搜索中

接下来,测试代码如下:

    class Program
    {
        static void Main(string[] args)
        {
            MyClass my = new MyClass(1);
            Type type = my.GetType();

            // GetConstructors()方法,获取所有公开的构造函数
            Console.WriteLine("没有参数:");
            ConstructorInfo[] infoArray1 = type.GetConstructors();
            foreach (ConstructorInfo info in infoArray1)
            {
                Console.Write(info.IsStatic);
            }

            Console.WriteLine();

            // 输入参数:BindingFlags.Public,获取所有公开的构造函数
            Console.WriteLine("输入参数:BindingFlags.Public,获取所有公开的构造函数:");
            ConstructorInfo[] infoArray2 = type.GetConstructors(BindingFlags.Public);
            foreach (ConstructorInfo info in infoArray2)
            {
                Console.Write(info.IsStatic);
            }

            Console.WriteLine();

            // 输入参数:BindingFlags.Public,获取所有公开的构造函数
            Console.WriteLine("输入参数:BindingFlags.Public | BindingFlags.Instance,获取所有公开的构造函数:");
            ConstructorInfo[] infoArray3 = type.GetConstructors(BindingFlags.Public | BindingFlags.Instance);
            foreach (ConstructorInfo info in infoArray3)
            {
                Console.Write(info.IsStatic);
            }

            Console.WriteLine();

            Console.WriteLine("输入参数:BindingFlags.Static | BindingFlags.NonPublic,获取所有静态的构造函数:");
            ConstructorInfo[] infoArray4 = type.GetConstructors(BindingFlags.Static | BindingFlags.NonPublic);
            foreach (ConstructorInfo info in infoArray4)
            {
                Console.Write(info.IsStatic);
            }

            Console.WriteLine();

            Console.WriteLine("输入参数:BindingFlags.NonPublic | BindingFlags.Instance,获取所有非公开的构造函数:");
            ConstructorInfo[] infoArray5 = type.GetConstructors(BindingFlags.NonPublic | BindingFlags.Instance);
            foreach (ConstructorInfo info in infoArray5)
            {
                Console.Write(info.IsStatic);
            }

            Console.ReadKey();
        }
    }

结果如下:
这是一个私有的构造方法这是一个私有的构造方法没有参数
False
输入参数:BindingFlags.Public,获取所有公开的构造函数

输入参数:BindingFlags.Public | BindingFlags.Instance,获取所有公开的构造函数
False
输入参数:BindingFlags.Static | BindingFlags.NonPublic,获取所有静态的构造函数
True
输入参数:BindingFlags.NonPublic | BindingFlags.Instance,获取所有非公开的构造函数
False

我想从结果中你应该已经发现一些什么了。我来总结下:
1. 搜索所有公开和非公开的构造函数时,必须要添加 BindingFlags.Instance(原因暂时不详,希望有看到的大大能解释下)。
2. 搜索所有静态的构造函数时,必须且只能添加 BindingFlags.NonPublic(原因暂时不详,希望有看到的大大能解释下)。

最后注:如果你想要获取所有的构造函数,可以将这个四个全部加上,即:BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.Instance。

你可能感兴趣的:(c#)