详解C#特性和反射(四)
本篇内容是特性和反射的最后一篇内容,前面三篇文章:
详解C#特性和反射(一)
详解C#特性和反射(二)
详解C#特性和反射(三)
一、晚期绑定(Late Binding)是一种在编译时不知道类型及其成员,而在运行时创建指定类型的实例并调用其成员的技术,使用命名空间System中的Activator类来实现晚期绑定,例如:
Type myType = Type.GetType(myClassName); //首先获取类型信息
object myObj = Activator.CreateInstance(myType); //通过Activator根据类型信息创建对象
//如果获取的类型可以获取到,即位于当前程序集,可以使用强制转换或as运算符得到该类型的变量,然后直接调用该对象的成员:
//MyClass myClass = (MyClass)myObj;
//也可以使用CreateInstance的泛型重载方法直接获取该类型的变量:
//MyClass myClass = Activator.CreateInstance<MyClass>();
//如果获取的类型不确定或当前程序编译时并没有引入该类型所在的命名空间,则需要通过反射访问该类型的成员:
MethodInfo methodInfo = myType.GetMethod(methodName); //获取类型中的方法信息
methodInfo.Invoke(myObj, null); //调用类型中的无参实例方法
※静态方法CreateInstance会调用匹配度最高的构造函数构建对象,例子中的CreateInstance(Type type)和CreateInstance<T>()只会调用目标类型中无参的公有构造函数,当目标类型中没有无参的公有构造函数时会抛出异常MissingMethodException;Activator类中提供多个CreateInstance的重载方法以调用不同的构造函数并传入参数,这里不再一一介绍,用到时查看定义即可看到所有的方法声明;
二、使用晚期绑定技术也会打破单例模式中的对象唯一性:
public class MyClass
{
public static MyClass Instace = new MyClass();
private MyClass()
{
Console.WriteLine("MyClass's Constructor Execute.");
}
public int MyFiled;
} public class Program
{
static void Main(string[] args)
{
Console.WriteLine("Access the static member Instace of MyClass.");
MyClass.Instace.MyFiled = ;
Console.WriteLine("Use the Activator class to create instance of MyClass.");
//通过CreateInstance的重载方法调用目标类型的私有构造函数
MyClass myObj = (MyClass)Activator.CreateInstance(typeof(MyClass), true);
Console.WriteLine($"Instace of MyClass's MyFiled is {MyClass.Instace.MyFiled}, myObj's MyFiled is {myObj.MyFiled}.");
Console.Read();
}
}
输出结果为(在.Net Core下运行,不同平台下静态成员的初始化时机略有不同,会导致这里第一行和第二行输出顺序不一致):
Access the static member Instace of MyClass.
MyClass's Constructor Execute.
Use the Activator class to create instance of MyClass.
MyClass's Constructor Execute.
Instace of MyClass's MyFiled is 10, myObj's MyFiled is 0.
因此在使用单例模式时,应当避免使用晚期绑定创建对象,而应使用反射获取单例中的静态成员Instance;
如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮,您的认可是我写作的最大动力!
作者:Minotauros
出处:https://www.cnblogs.com/minotauros/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
详解C#特性和反射(四)的更多相关文章
- 详解C#泛型(二) 获取C#中方法的执行时间及其代码注入 详解C#泛型(一) 详解C#委托和事件(二) 详解C#特性和反射(四) 记一次.net core调用SOAP接口遇到的问题 C# WebRequest.Create 锚点“#”字符问题 根据内容来产生一个二维码
详解C#泛型(二) 一.自定义泛型方法(Generic Method),将类型参数用作参数列表或返回值的类型: void MyFunc<T>() //声明具有一个类型参数的泛型方法 { ...
- EF+LINQ事物处理 C# 使用NLog记录日志入门操作 ASP.NET MVC多语言 仿微软网站效果(转) 详解C#特性和反射(一) c# API接受图片文件以Base64格式上传图片 .NET读取json数据并绑定到对象
EF+LINQ事物处理 在使用EF的情况下,怎么进行事务的处理,来减少数据操作时的失误,比如重复插入数据等等这些问题,这都是经常会遇到的一些问题 但是如果是我有多个站点,然后存在同类型的角色去操作 ...
- 详解C#特性和反射(一)
使用特性(Attribute)可以将描述程序集的信息和描述程序集中任何类型和成员的信息添加到程序集的元数据和IL代码中,程序可以在运行时通过反射获取到这些信息: 一.通过直接或间接的继承自抽象类Sys ...
- 详解C#特性和反射(二)
使用反射(Reflection)使得程序在运行过程中可以动态的获取对象或类型的类型信息,然后调用该类型的方法和构造函数,或访问和修改该类型的字段和属性:可以通过晚期绑定技术动态的创建类型的实例:可以获 ...
- 详解C#特性和反射(三)
类型信息(Type Information)用来表示类型声明的信息,通过抽象基类System.Type的实例存储这些信息,当使用反射时,CLR获取指定类型的Type对象,通过这个对象即可访问该类型的任 ...
- 【转】详解C#中的反射
原帖链接点这里:详解C#中的反射 反射(Reflection) 2008年01月02日 星期三 11:21 两个现实中的例子: 1.B超:大家体检的时候大概都做过B超吧,B超可以透过肚皮探测到你内 ...
- 详解vue 路由跳转四种方式 (带参数)
详解vue 路由跳转四种方式 (带参数):https://www.jb51.net/article/160401.htm 1. router-link ? 1 2 3 4 5 6 7 8 9 10 ...
- 详解Java8特性之新的日期时间 API
详解Java8特性之新的日期时间 API http://blog.csdn.net/timheath/article/details/71326329 Java8中时间日期库的20个常用使用示例 ht ...
- Git使用总结 Asp.net生命周期与Http协议 托管代码与非托管代码的区别 通过IEnumerable接口遍历数据 依赖注入与控制反转 C#多线程——优先级 AutoFac容器初步 C#特性详解 C#特性详解 WPF 可触摸移动的ScrollViewer控件 .NET(C#)能开发出什么样的APP?盘点那些通过Smobiler开发的移动应用
一,原理 首先,我们要明白Git是什么,它是一个管理工具或软件,用来管理什么的呢?当然是在软件开发过程中管理软件或者文件的不同版本的工具,一些作家也可以用这个管理自己创作的文本文件,由Linus开发的 ...
随机推荐
- bash多进程
#!/bin/bashCMD_PATH=`dirname $0`#echo $CMD_PATH > /home/wubin/testjava -jar $CMD_PATH/Server.jar ...
- noip第7课资料
- Qt程序关于路径、用户目录路径、临时文件夹位置获取方法
比如我们有一个程序在: C:/Qt/examples/tools/regexp/regexp.exe 1. 程序所在目录 QString QCoreApplication::applicationDi ...
- ajax点击加载更多图片
<!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>& ...
- Android Studio-引用jar及so文件
一.引用jar文件 1.将jar文件复制.粘贴到app的libs目录中: 2.右键点击jar文件,并点击弹出菜单中的“Add As Library”,将jar文件作为类库添加到项目中: ...
- Alpha阶段scrum meeting七天冲刺博客-天冷记得穿秋裤队
Alpha阶段scrum meeting七天冲刺博客 day url 第一天 https://www.cnblogs.com/laomiXD/articles/9874052.html 第二天 htt ...
- 数据库中表的位置,在sysdatabases中
name dbid sid mode status status2 crdate reserved category cmptlevel filename version master :: :: C ...
- PhantomJS快速入门-无界面浏览器
https://blog.csdn.net/libsyc/article/details/78199850 PhantomJS快速入门 本文简要介绍了PhantomJS的相关基础知识点,主要包括Pha ...
- ASP.NET Core2利用MassTransit集成RabbitMQ
在ASP.NET Core上利用MassTransit来集成使用RabbitMQ真的很简单,代码也很简洁.近期因为项目需要,我便在这基础上再次进行了封装,抽成了公共方法,使得使用RabbitMQ的调用 ...
- Azure DevOps Server (TFS)中代码文件换行问题解决方案(Git)
之前写过一篇博客"探索TFS Git 库文件换行(CRLF)的处理方式",主要是针对TFVC代码库的. 下面这篇文章说明如何在TFS的Git库中处理代码换行的问题. 概述 在Azu ...