.Net C# 反射,了解只需3分钟
Posted OneByOneDotNet
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了.Net C# 反射,了解只需3分钟相关的知识,希望对你有一定的参考价值。
什么是反射
官方定义:
反射提供描述程序集、模块和类型的对象(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();
}
}
首尾呼应、重复强调、重要事情说三遍
当我们需要获取一个程序集或者一个类的所有属性(名称、类型等)、方法(名称、类型等)等信息时,我们就需要反射。
反射就像一个朦胧的镜子,抽象折射一个程序集或者一个类的所有信息。
反射就像一个朦胧的镜子,抽象折射一个程序集或者一个类的所有信息。
反射就像一个朦胧的镜子,抽象折射一个程序集或者一个类的所有信息。
更详细的信息参考官方文档
后记
本人不是大佬,只是道路先行者,在落河后,向后来的人大喊一声:
这里有坑,不要过来啊!
纵然如此,依旧有人重复着落河,重复着呐喊·····
技术交流Q群:1012481075 群内有各种流行书籍资料
你的一分鼓励,我的十分动力,点赞免费,感恩回馈。喜欢就点赞评论吧,双击6666~
以上是关于.Net C# 反射,了解只需3分钟的主要内容,如果未能解决你的问题,请参考以下文章