C# 中反射获取某类的子类和根据类型名动态创建对象
有时候,为了快速批量处理已经实现某个基类或者某个接口的子类,需要通过反射的方式获取到他们的类类型(Type),然后再通过
1
|
Activator.CreateInstance(objType); |
或者
1
|
Assembly.Load(path).CreateInstance(typeName); |
或者
1
|
Assembly.LoadFile(filePath).CreateInstance(typeName); |
创建对象实例。
以下通过一个简单的示例来展示:
1,获取当前程序集中的全部类型;
2,判断某一类型是否是继承与另一类型;
3,根据类型名动态创建对象。
目前还有个疑问,不知道谁能解答:
1,如何判断某个类是否实现了某个接口,目前只能先 new 一个对象,然后再 用 is 判断。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
|
using System; using System.Collections.Generic; using System.Text; using System.Reflection; using System.Diagnostics; namespace com.hetaoos { class Test { public Test() { var types = Assembly.GetExecutingAssembly().GetTypes(); var baseType = typeof (BaseProcessor); List<BaseProcessor> processors = new List<BaseProcessor>(); foreach ( var t in types) { var tmp = t.BaseType; while (tmp != null ) { if (tmp == baseType) { BaseProcessor obj = MethodMaker.CreateObject(t.FullName) as BaseProcessor; if (obj != null ) { processors.Add(obj); } break ; } else { tmp = tmp.BaseType; } } } Debug.Print( "Processor Count:{0}" , processors.Count); foreach ( var p in processors) { Debug.Print( "{0}\t:{1}" , p, p.Calc(2, 5)); } } } public class MethodMaker { /// <summary> /// 创建对象(当前程序集) /// </summary> /// <param name="typeName">类型名</param> /// <returns>创建的对象,失败返回 null</returns> public static object CreateObject( string typeName) { object obj = null ; try { Type objType = Type.GetType(typeName, true ); obj = Activator.CreateInstance(objType); } catch (Exception ex) { Debug.Write(ex); } return obj; } /// <summary> /// 创建对象(外部程序集) /// </summary> /// <param name="path"></param> /// <param name="typeName">类型名</param> /// <returns>创建的对象,失败返回 null</returns> public static object CreateObject( string path, string typeName) { object obj = null ; try { obj = Assembly.Load(path).CreateInstance(typeName); } catch (Exception ex) { Debug.Write(ex); } return obj; } } public abstract class BaseProcessor { public abstract int Calc( int a, int b); } public class Adder : BaseProcessor { public override int Calc( int a, int b) { return a + b; } } public class Multiplier : BaseProcessor { public override int Calc( int a, int b) { return a * b; } } } |
输出结果为:
1
2
3
|
Processor Count:2 com.hetaoos.Adder :7 com.hetaoos.Multiplier :10 |
PS:
判断某个类是否继承自某个接口、类的方法:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
public static bool IsParent(Type test, Type parent) { if (test == null || parent == null || test == parent || test.BaseType == null ) { return false ; } if (parent.IsInterface) { foreach ( var t in test.GetInterfaces()) { if (t == parent) { return true ; } } } else { do { if (test.BaseType == parent) { return true ; } test = test.BaseType; } while (test != null ); } return false ; } |
C# 中反射获取某类的子类和根据类型名动态创建对象的更多相关文章
- java中的反射机制,以及如何通过反射获取一个类的构造方法 ,成员变量,方法,详细。。
首先先说一下类的加载,流程.只有明确了类这个对象的存在才可以更好的理解反射的原因,以及反射的机制. 一. 类的加载 当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过加载,连接,初始化三 ...
- org.reflections 接口通过反射获取实现类源码研究
org.reflections 接口通过反射获取实现类源码研究 版本 org.reflections reflections 0.9.12 Reflections通过扫描classpath,索引元数据 ...
- Java实现通过反射获取指定类的所有信息
package com.ljy; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.l ...
- thinkphp模型中的获取器和修改器(根据字段名自动调用模型中的方法)
thinkphp模型中的获取器和修改器(根据字段名自动调用模型中的方法) 一.总结 记得看下面 1.获取器的作用是在获取数据的字段值后自动进行处理 2.修改器的作用是可以在数据赋值的时候自动进行转换处 ...
- java-通过反射获取目标类的属性,方法,构造器
首先定义一个urse package com.studay_fanshe; public class User { private String uname; private int age; pri ...
- 【Java基础】Java中如何获取一个类中泛型的实际类型
泛型的术语 <>: 念做typeof List<E>: E称为类型参数变量 ArrayList<Integer>: Integer称为实际类型参数 ArrayLis ...
- Java中如何获取一个类中泛型的实际类型
本文链接:https://blog.csdn.net/kuuumo/article/details/83021158 _______________________________________ ...
- C# 通过反射获取方法/类上的自定义特性
1.所有自定义属性都必须继承System.Attribute 2.自定义属性的类名称必须为 XXXXAttribute 即是已Attribute结尾 自定义属性QuickWebApi [Attribu ...
- C#利用反射获取实体类的主键名称或者获取实体类的值
//获取主键的 PropertyInfo PropertyInfo pkProp = ).FirstOrDefault(); //主键名称 var keyName=pkProp.Name; //实体类 ...
随机推荐
- [ZigBee] 15、Zigbee协议栈应用(一)——Zigbee协议栈介绍及简单例子(长文,OSAL及Zigbee入门知识)
1.Zigbee协议栈简介 协议是一系列的通信标准,通信双方需要按照这一标准进行正常的数据发射和接收.协议栈是协议的具体实现形式,通俗讲协议栈就是协议和用户之间的一个接口,开发人员通过使用协议栈来使用 ...
- http学习笔记(三)
几乎所有的http通信都是由TCP/IP承载的.http好比一辆汽车,而TCP是一条公路,所有的汽车都要在公路上跑,看看http是如何在tcp这条公路上往返的. 首先简单地看看tcp,TCP连接是通过 ...
- 《OOC》笔记(1)——C语言const、static和extern的用法
<OOC>笔记(1)——C语言const.static和extern的用法 C语言中const关键字用法不少,我只喜欢两种用法.一是用于修饰函数形参,二是用于修饰全局变量和局部变量. 用c ...
- python 多线程网络编程 ( 二 )
背景 我在[第一篇文章中]已经介绍了如何实现一个多线程的todo应用,接下来我将会研究如何使这个服务器完成下面这几个功能. 1.使用正则表达式解析用户发送的请求数据: 2.使用ThreadLocal技 ...
- jQuery对 动态添加 的元素 绑定事件(on()的用法)
从jQuery 版本 1.7 起,on() 方法是向被选元素添加事件处理程序的(官方推荐)首选方法. 当浏览器下载完一个页面的时候就开始渲染(翻译)HTML标签,然后执行css.js代码,在执行js代 ...
- 下列哪项不属于jdk1.6垃圾收集器?
下列哪项不属于jdk1.6垃圾收集器? A. Serail 收集器 B. parNew 收集器 C. CMS 收集器 D. G1 收集器 答案:D 解:Java垃圾收集器发展路径下图所示: 其 ...
- 【译】怎样编写移动优先的CSS
原文:How To Write Mobile-first CSS 作者: 译者:huansky 构建响应式网站是今天前端开发人员必备的技能. 当我们谈论响应式网站时,移动优先这个词立刻就会浮现. 我们 ...
- Render OpenCascade Geometry Surfaces in OpenSceneGraph
在OpenSceneGraph中绘制OpenCascade的曲面 Render OpenCascade Geometry Surfaces in OpenSceneGraph eryar@163.co ...
- struts2拦截器
一.自定义拦截器 struts2拦截器类似于servlet过滤器 首先定义一个拦截器这个拦截器实现了Interceptor接口: package cn.orlion.interceptor; impo ...
- 《BI那点儿事》Microsoft 聚类分析算法——三国人物身份划分
什么是聚类分析? 聚类分析属于探索性的数据分析方法.通常,我们利用聚类分析将看似无序的对象进行分组.归类,以达到更好地理解研究对象的目的.聚类结果要求组内对象相似性较高,组间对象相似性较低.在三国数据 ...