c# 工厂模式 类名 转对象
方式一:通过类名来生成对象(优势:方便;劣势:不能以递增方式增加需转化成对象的类文件,即每次发布需整个项目重新编译)经测试正确
public class FruitFactory
{
public IFruit MakeFruit(string Name)
{
IFruit MyFruit = null;
try
{
Type type = Type.GetType(Name,true);
MyFruit = (IFruit)Activator.CreateInstance(type);
}
catch (TypeLoadException e)
Console.WriteLine("I dont know this kind of fruit,exception caught - {0}" ,e.Message);
return MyFruit;
}
}
方式二:通过反射(需提供文件路径,类名;优势:可以以递增文件的方式发布程序;劣势:生成文件麻烦)未测试
/// <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);
}
另外参见:http://blog.hetaoos.com/archives/40
C# 中反射获取某类的子类和根据类型名动态创建对象
2010/10/11 于 23:35 Null 已有 7 条评论
有时候,为了快速批量处理已经实现某个基类或者某个接口的子类,需要通过反射的方式获取到他们的类类型(Type),然后再通过
1 Activator.CreateInstance(objType);
或者
1 Assembly.Load(path).CreateInstance(typeName);
或者
1 Assembly.LoadFile(filePath).CreateInstance(typeName);
创建对象实例。
以下通过一个简单的示例来展示:
1,获取当前程序集中的全部类型;
2,判断某一类型是否是继承与另一类型;
3,根据类型名动态创建对象。
目前还有个疑问,不知道谁能解答:
1,如何判断某个类是否实现了某个接口,目前只能先 new 一个对象,然后再 用 is 判断。
001 using System;
002 using System.Collections.Generic;
003 using System.Text;
004 using System.Reflection;
005 using System.Diagnostics;
006
007 namespace com.hetaoos
008 {
009
010 class Test
011 {
012 public Test()
013 {
014 var types = Assembly.GetExecutingAssembly().GetTypes();
015 var baseType = typeof(BaseProcessor);
016 List<BaseProcessor> processors = new List<BaseProcessor>();
017 foreach (var t in types)
018 {
019 var tmp = t.BaseType;
020 while (tmp != null)
021 {
022 &