.Net 5 C# 反射(Reflection)

什么是反射

官方定义:

反射提供描述程序集、模块和类型的对象(Type 类型)。 可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型,然后调用其方法或访问器字段和属性。 如果代码中使用了特性,可以利用反射来访问它们。

个人理解:

当我们需要获取一个程序集或者一个类的所有属性(名称、类型等)、方法(名称、类型等)等信息时,我们就需要反射。

反射就像一个朦胧的镜子,抽象折射一个程序集或者一个类的所有信息。
反射就像一个朦胧的镜子,抽象折射一个程序集或者一个类的所有信息。
反射就像一个朦胧的镜子,抽象折射一个程序集或者一个类的所有信息。
重复3次,希望你能咀嚼

有什么用?怎么用?

比如我们定义一个int类型的i变量,想获取它的类型信息,我们就可以使用反射

获取类型的类型信息。

// Using GetType to obtain type information:
int i = 42;
Type type = i.GetType();
Console.WriteLine(type);

输出为:System.Int32。

或者你会困惑,我不是已经知道了int类型了嘛?还要反射干哈?

这里只是举例,那如果是泛型呢?

获取泛型信息

// The following method displays information about a generic
    // type.
    private static void DisplayGenericType(Type t)
    {
        Console.WriteLine("\r\n {0}", t);
        Console.WriteLine("   Is this a generic type? {0}",
            t.IsGenericType);
        Console.WriteLine("   Is this a generic type definition? {0}",
            t.IsGenericTypeDefinition);

        // Get the generic type parameters or type arguments.
        Type[] typeParameters = t.GetGenericArguments();

        Console.WriteLine("   List {0} type arguments:",
            typeParameters.Length);
        foreach( Type tParam in typeParameters )
        {
            if (tParam.IsGenericParameter)
            {
                DisplayGenericParameter(tParam);
            }
            else
            {
                Console.WriteLine("      Type argument: {0}",
                    tParam);
            }
        }
    }

如果是加载的程序集呢?

获取程序集的信息

// Using Reflection to get information of an Assembly:
Assembly info = typeof(int).Assembly;
Console.WriteLine(info);

输出为:System.Private.CoreLib, Version=4.0.0.0, Culture=neutral,PublicKeyToken=7cec85d7bea7798e。

从已加载的程序集获取 Type 对象

当我们需要获取程序集内的exe的全名时

// Loads an assembly using its file name.
Assembly a = Assembly.LoadFrom("MyExe.exe");
// Gets the type names from the assembly.
Type[] types2 = a.GetTypes();
foreach (Type t in types2)
{
    Console.WriteLine(t.FullName);
}

查看类的信息

下列示例演示如何列出类的构造函数,在本例中即指 String 类。

//请注意引用反射命名空间
using System;
using System.Reflection;

class ListMembers
{
    public static void Main()
    {
        Type t = typeof(System.String);
        Console.WriteLine("Listing all the public constructors of the {0} type", t);
        //BindingFlags是Reflection空间下的枚举类型
        // 使用GetConstructors方法获取Public(公共),Instance(实例)的构造方法
        ConstructorInfo[] ci = t.GetConstructors(BindingFlags.Public | BindingFlags.Instance);
        Console.WriteLine("//Constructors");
        PrintMembers(ci);
    }

    public static void PrintMembers(MemberInfo[] ms)
    {
        foreach (MemberInfo m in ms)
        {
            Console.WriteLine("{0}{1}", "     ", m);
        }
        Console.WriteLine();
    }
}

首尾呼应、重复强调、重要事情说三遍

当我们需要获取一个程序集或者一个类的所有属性(名称、类型等)、方法(名称、类型等)等信息时,我们就需要反射。

反射就像一个朦胧的镜子,抽象折射一个程序集或者一个类的所有信息。
反射就像一个朦胧的镜子,抽象折射一个程序集或者一个类的所有信息。
反射就像一个朦胧的镜子,抽象折射一个程序集或者一个类的所有信息。

更详细的信息参考官方文档

后记

本人不是大佬,只是道路先行者,在落河后,向后来的人大喊一声,这里有坑,不要过来啊!

纵然如此,依旧有人重复着落河,重复着呐喊······

个人博客网站 Blog

文章后续会在公众号更新,微信搜索 OneByOneDotNet 即可关注。

你的一分鼓励,我的十分动力,点赞免费,感恩回馈。喜欢就点赞评论吧,双击6666~

技术交流Q群: 1012481075 群内有各种流行书籍资料
文章后续会在公众号更新,微信搜索 OneByOneDotNet 即可关注。
你的一分鼓励,我的十分动力,点赞免费,感恩回馈。喜欢就点赞评论吧,双击6666~
本网站(网站地址)刊载的所有内容,包括文字、图片、音频、视频、软件、程序、以及网页版式设计等均在网上搜集。
访问者可将本网站提供的内容或服务用于个人学习、研究或欣赏,以及其他非商业性或非盈利性用途,但同时应遵守著作权法及其他相关法律的规定,不得侵犯本网站及相关权利人的合法权利。
除此以外,将本网站任何内容或服务用于其他用途时,须征得本网站及相关权利人的书面许可,并支付报酬.
本网站内容原作者如不愿意在本网站刊登内容,请及时通知本站,予以删除.
转载请注明出处
作者昵称:OneByOneDotNet
作者链接:https://onebyone.icu/user/1
网站标题:OneByOne DotNet
网站地址:https://onebyone.icu
文章标题:.Net 5 C# 反射(Reflection)
文章链接:https://onebyone.icu/archives/1341
原文出处:https://onebyone.icu/?p=1341
原文链接:https://onebyone.icu/?p=1341
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

发表评论

邮箱地址不会被公开。 必填项已用*标注

WeChat
WeChat
QQ
QQ
返回顶部