C#中通过读取配置文件动态创建泛型对象


众所周知,在c#中,我们在获知的某一类型后,可以运用Activator.CreateInstance来动态的创建对象的实例。获取类型的话,可以使用typeof或者GetType来实现。而笔者最近遇到了一个需要通过读取配置文件来动态创建泛型类型的案例,让我们一起来看一下。

1. 背景

我们考虑一下这样的一个场景,我们需要开发了一个用于排序的通用的可扩展的库。利用该库,用户可以自定义排序规则(比较大小)以及需要进行排序的数据类型。而同时,我们开发了一个应用程序,在该应用程序中,我们可以让用户选择排序算法来进行排序。由于我们的排序库是可扩展的,因此,在开发应用程序的时候,我们并不知道会有多少种排序算法可供使用,因此我需要通过读取配置文件来动态的加载排序算法。

2. 排序库Sort.Lib

在Sort.Lib中,我们定义所有排序算法的通用接口,ISortAlgorithm

?
1
2
3
4
public  interface  ISortAlgorithm<T>
{
     void  Sort(List<T> source, Func<T, T, int > compare);
}

比如我们有一个排序算法,叫HeapSort,注意该算法可能在Sort.Lib程序集中,也可能不在。

?
1
2
3
4
5
6
7
public  class  HeapSortAlgorithm<T> : ISortAlgorithm<T>
{
     public  void  Sort(List<T> source, Func<T, T, int > compare)
     {
         //TODO: sort the source
     }
}

3. 应用程序Sort.App

3.1 动态创建排序算法

我们知道,要动态的创建HeapSortAlgorithm,只需要获取到其类型,然后利用Activator.CreateInstance就行。例如:

?
1
Activator.CreateInstance(Assembly.Load("assembly").GetType("full type name"));

 

而在此处,由于我们的HeapSortAlgorithm是个泛型类,则需要给泛型中的T赋予实际的类型。我们可以通过先获取泛型类型,再通过MakeGenericType来创建实际的类型。如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
string  assemblyName = string .Empty;
string  fullTypeName = string .Empty;
 
//TODO: 读取配置文件,赋值给assemblyName和fullTypeName
 
Type[] typeArgs = { typeof ( int ) };
 
Type algTypeGen = Assembly.Load(assemblyName).GetType(fullTypeName);
 
//TODO: 判断algTypeGen是否实现了ISortAlgorithm<T>接口
 
// 获取HeapSortAlgorithm<int>类型
Type algType = algTypeGen.MakeGenericType(typeArgs);
 
HeapSortAlgorithm< int > heapSortAlg = Activator.CreateInstance(algType);

如此这般,我们的HeapSort算法就可以用上。

3.2 配置文件

为了使我们的应用程序能够用上HeapSort,我们将其添加到我们的配置文件中去,如下

?
1
2
3
< SortAlgorithms >
     < Algorithm  name = "HeapSort"  assembly = "Sort.Lib"  type = "Sort.Lib.HeapSortAlgorithm`1"  />
</ SortAlgorithms >

注意到配置中type一项设置为Sort.Lib.HeapSortAlgorithm`1,这是因为泛型类HeapSortAlgorithm<T>在运行过程中,它的实际名称是HeapSortAlgorithm`1,这也可以通过typeof(HeapSortAlgorithm<>)得到。(注:关于这点,不知道这个泛型的名称会不会变成HeapSortAlgorithm`2之类的,笔者还不太确定,希望有哪个大大们赐教)

另:如何去读取配置文件的代码在本文中我就不贴出来了。可以自己写ConfigurationSection类后来获取(推荐),或者直接通过c#中读取XML文件的方式来实现。:)

3.3 判断类型是否实现泛型接口

判断algTypeGen是否实现了ISortAlgorithm<T>接口,可以通过对algTypeGen实现的所有接口与ISortAlgorithm<>循环比对即可实现。

?
1
2
3
4
Type baseSortAlgType = typeof (ISortAlgorithm<>);
bool  isImplemented = algTypeGen.GetInterfaces().Any(x =>
   x.IsGenericType &&
   x.GetGenericTypeDefinition() == baseSortAlgType);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
《轻松学C#(图解版)》完整扫描版================================================================ 基本信息 作者:谷涛、扶晓、毕国锋 丛书名:轻松学开发 出版社:电子工业出版社 ISBN:978-7-121-20223-0 出版日期:2013年6月 开本:16开 页码:408页 版次:1-1 定价:¥55.00 所属分类:计算机 > 软件与程序设计 > C# ================================================================ 内容简介 本书由浅入深,全面、系统地介绍了C#程序设计。除了详细地讲解C#知识点外,本书还提供了大量的实例,供读者实战演练。本书共分三篇。第一篇是C#概述篇,主要介绍的是Visual Studio 2012的开发环境及搭建。第二篇是面向对象基础篇,主要介绍类、对象、字段、方法、流程控制、数组、继承、属性、运算符重载、接口等C#基本内容。第三篇是应用技术篇,主要介绍的是异常处理、文件和流、委托、事件、Lambda表达式、命名空间、预处理器、程序集、运行时类标识、反射、特性、泛型、LINQ和数据库开发等。 ================================================================ 图书目录 第一篇 C#概述篇 第1章 C#入门 2 1.1 C#概述 2 1.1.1 C#的发展 2 1.1.2 C#开发的基础 2 1.2 搭建开发环境 3 1.2.1 Visual Studio 2012软硬件配置要求 3 1.2.2 下载Visual Studio 2012 3 1.2.3 安装Visual Studio 2012 4 1.2.4 初始化配置 7 1.3 第一个程序—Hello World 8 1.4 小结 11 1.5 习题 12 第二篇 面向对象基础篇 第2章 类和对象 16 2.1 分析Hello World程序 16 2.2 语法规范 17 2.2.1 标识符 17 2.2.2 关键字 18 2.2.3 注释 19 2.3 定义类 20 2.4 实例化对象 20 2.5 小结 20 2.6 习题 21 第3章 定义类——字段 23 3.1 数据类 23 3.1.1 简单值类 23 3.1.2 值的表示——字面量 26 3.1.3 转义序列 27 3.2 定义字段 27 3.2.1 定义字段 28 3.2.2 静态字段和实例字段的访问 28 3.2.3 字段初始化 29 3.2.4 字段的动态赋值——Read()和ReadLine() 31 3.2.5 字段输出 31 3.2.6 格式化输出 32 3.2.7 数据类转换 39 3.2.8 只读字段 41 3.2.9 访问控制 41 3.3 运算符 43 3.3.1 算术运算符 43 3.3.2 自增、自减运算符 44 3.3.3 复合赋值运算符 45 3.3.4 位运算符 46 3.3.5 sizeof运算符 47 3.3.6 运算符的优先级 47 3.4 小结 49 3.5 习题 49 第4章 定义类——方法 51 4.1 方法的概述 51 4.1.1 定义方法 51 4.1.2 方法的调用 52 4.2 方法体的构成 53 4.2.1 局部变量 53 4.2.2 局部变量与字段同名的解决——this关键字 54 4.2.3 语句 55 4.2.4 全局变量 55 4.3 返回值 56 4.3.1 返回值类 56 4.3.2 从方法返回 57 4.4 参数 58 4.4.1 参数的分类 58 4.4.2 引用参数(ref参数) 59 4.4.3 输出参数(out参数) 61 4.5 特殊的方法 62 4.5

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值