知识大全 C#中通过读取配置文件动态创建泛型对象
Posted 类型
篇首语:多练多乖,不练就呆。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 C#中通过读取配置文件动态创建泛型对象相关的知识,希望对你有一定的参考价值。
C#中通过读取配置文件动态创建泛型对象 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
背景
我们考虑一下这样的一个场景 我们需要开发了一个用于排序的通用的可扩展的库 利用该库 用户可以自定义排序规则(比较大小)以及需要进行排序的数据类型 而同时 我们开发了一个应用程序 在该应用程序中 我们可以让用户选择排序算法来进行排序 由于我们的排序库是可扩展的 因此 在开发应用程序的时候 我们并不知道会有多少种排序算法可供使用 因此我需要通过读取配置文件来动态的加载排序算法
排序库Sort Lib
在Sort Lib中 我们定义所有排序算法的通用接口 ISortAlgorithm
public interface ISortAlgorithm<T>
void Sort(List<T> source Func<T T int> pare);
比如我们有一个排序算法 叫HeapSort 注意该算法可能在Sort Lib程序集中 也可能不在
public class HeapSortAlgorithm<T> : ISortAlgorithm<T>
public void Sort(List<T> source Func<T T int> pare)
//TODO: sort the source
应用程序Sort App
动态创建排序算法
我们知道 要动态的创建HeapSortAlgorithm 只需要获取到其类型 然后利用Activator CreateInstance就行 例如:
Activator CreateInstance(Assembly Load( assembly ) GetType( full type name );
而在此处 由于我们的HeapSortAlgorithm是个泛型类 则需要给泛型中的T赋予实际的类型 我们可以通过先获取泛型类型 再通过MakeGenericType来创建实际的类型 如下
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算法就可以用上
配置文件
为了使我们的应用程序能够用上HeapSort 我们将其添加到我们的配置文件中去 如下
<SortAlgorithms>
<Algorithm name= HeapSort assembly= Sort Lib type= Sort Lib HeapSortAlgorithm` />
</SortAlgorithms>
注意到配置中type一项设置为Sort Lib HeapSortAlgorithm` 这是因为泛型类HeapSortAlgorithm<T>在运行过程中 它的实际名称是HeapSortAlgorithm` 这也可以通过typeof(HeapSortAlgorithm<>)得到 (注 关于这点 不知道这个泛型的名称会不会变成HeapSortAlgorithm` 之类的 笔者还不太确定 希望有哪个大大们赐教)
另 如何去读取配置文件的代码在本文中我就不贴出来了 可以自己写ConfigurationSection类后来获取(推荐) 或者直接通过c#中读取XML文件的方式来实现 :)
判断类型是否实现泛型接口
判断algTypeGen是否实现了ISortAlgorithm<T>接口 可以通过对algTypeGen实现的所有接口与ISortAlgorithm<>循环比对即可实现
Type baseSortAlgType = typeof(ISortAlgorithm<>);
bool isImplemented = algTypeGen GetInterfaces() Any(x =>
x IsGenericType &&
x GetGenericTypeDefinition() == baseSortAlgType);
后记
cha138/Article/program/net/201311/13694相关参考
在C#中如何读取配置文件[1] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 配置文件概述 应
在c#中运用到操作流时首先要加入以下两个命名空间 usingSystemIO; usingSystemCollections; 我总结了以下几种方式来进行IO操作很简便但却很实用 目录的创
在C#中如何读取配置文件[2] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 不同的type不但
在C#中如何读取配置文件[3] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!通过上面的代码我们可以
C#泛型编程基础知识总结 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 在项目中通过对项目不断更
彻底剖析C#2.0泛型类的创建和使用 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!lishixin
C#来创建和读取XML文档 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 扩展标记语言XML(e
使用C#读取dbf行情文件 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 由于历史的原因我国的上
Jar内外配置文件的读取 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 一个简单的例子提供读取J
C#怎样用excel.dll读取excel文件 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!