知识大全 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]

在C#中如何读取配置文件[1]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  配置文件概述  应

知识大全 c#文件的创建、读取及写入

  在c#中运用到操作流时首先要加入以下两个命名空间  usingSystemIO;  usingSystemCollections;  我总结了以下几种方式来进行IO操作很简便但却很实用  目录的创

知识大全 在C#中如何读取配置文件[2]

在C#中如何读取配置文件[2]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  不同的type不但

知识大全 在C#中如何读取配置文件[3]

在C#中如何读取配置文件[3]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!通过上面的代码我们可以

知识大全 C#泛型编程基础知识总结

C#泛型编程基础知识总结  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  在项目中通过对项目不断更

知识大全 彻底剖析C# 2.0泛型类的创建和使用

彻底剖析C#2.0泛型类的创建和使用  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!lishixin

知识大全 C#来创建和读取XML文档

C#来创建和读取XML文档  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  扩展标记语言XML(e

知识大全 使用C#读取dbf行情文件

使用C#读取dbf行情文件  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  由于历史的原因我国的上

知识大全 Jar内外配置文件的读取

Jar内外配置文件的读取  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  一个简单的例子提供读取J

知识大全 C#怎样用excel.dll读取excel文件

C#怎样用excel.dll读取excel文件  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!