方式一:通过类名来生成对象(优势:方便;劣势:不能以递增方式增加需转化成对象的类文件,即每次发布需整个项目重新编译)经测试正确
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 if (tmp == baseType)
023 {
024 BaseProcessor obj = MethodMaker.CreateObject(t.FullName) as BaseProcessor;
025 if (obj != null)
026 {
027 processors.Add(obj);
028 }
029 break;
030 }
031 else
032 {
033 tmp = tmp.BaseType;
034 }
035 }
036 }
037
038 Debug.Print("Processor Count:{0}", processors.Count);
039 foreach (var p in processors)
040 {
041 Debug.Print("{0}\t:{1}", p, p.Calc(2, 5));
042 }
043 }
044 }
045
046 public class MethodMaker
047 {
048
049 /// <summary>
050 /// 创建对象(当前程序集)
051 /// </summary>
052 /// <param name="typeName">类型名</param>
053 /// <returns>创建的对象,失败返回 null</returns>
054 public static object CreateObject(string typeName)
055 {
056 object obj = null;
057 try
058 {
059 Type objType = Type.GetType(typeName, true);
060 obj = Activator.CreateInstance(objType);
061 }
062 catch (Exception ex)
063 {
064 Debug.Write(ex);
065 }
066 return obj;
067 }
068
069 /// <summary>
070 /// 创建对象(外部程序集)
071 /// </summary>
072 /// <param name="path"></param>
073 /// <param name="typeName">类型名</param>
074 /// <returns>创建的对象,失败返回 null</returns>
075 public static object CreateObject(string path, string typeName)
076 {
077 object obj = null;
078 try
079 {
080
081 obj = Assembly.Load(path).CreateInstance(typeName);
082 }
083 catch (Exception ex)
084 {
085 Debug.Write(ex);
086 }
087
088 return obj;
089 }
090 }
091
092 public abstract class BaseProcessor
093 {
094 public abstract int Calc(int a, int b);
095 }
096
097 public class Adder : BaseProcessor
098 {
099 public override int Calc(int a, int b)
100 {
101 return a + b;
102 }
103 }
104
105 public class Multiplier : BaseProcessor
106 {
107 public override int Calc(int a, int b)
108 {
109 return a * b;
110 }
111 }
112 }
输出结果为:
1 Processor Count:2
2 com.hetaoos.Adder :7
3 com.hetaoos.Multiplier :10
PS:
判断某个类是否继承自某个接口、类的方法:
01 public static bool IsParent(Type test, Type parent)
02 {
03 if (test == null || parent == null || test == parent || test.BaseType == null)
04 {
05 return false;
06 }
07 if (parent.IsInterface)
08 {
09 foreach (var t in test.GetInterfaces())
10 {
11 if (t == parent)
12 {
13 return true;
14 }
15 }
16 }
17 else
18 {
19 do
20 {
21 if (test.BaseType == parent)
22 {
23 return true;
24 }
25 test = test.BaseType;
26 } while (test != null);
27
28 }
29 return false;
return obj;
}
分享到:
相关推荐
### C#中的简单工厂模式与工厂方法模式 #### 一、引言 在软件工程领域,设计模式是一种被广泛接受的解决特定问题的最佳实践。在众多设计模式中,工厂模式因其能够灵活创建对象而备受推崇。本文将详细介绍两种常见...
工厂模式是一种创建型设计模式,它提供了一种创建对象的最佳方式,通过创建一个工厂类来生产特定类型的对象,而不是直接实例化。在C#中,我们可以定义一个抽象工厂类,包含创建产品对象的抽象方法,然后创建多个...
在软件设计领域,设计模式是一种在特定情境下解决常见问题的最佳实践。简单工厂模式是创建型设计模式之一...在实际开发中,尤其是在需要动态选择对象类型或避免硬编码类名的情况下,简单工厂模式是一个非常有效的工具。
《C#工厂模式应用源代码》 工厂模式是软件设计模式中的一个经典模式,它在.NET框架和C#编程中有着广泛的应用。本示例旨在帮助开发者深入理解工厂模式的概念和实际运用,对于那些对工厂设计模式感到困惑的朋友们,这...
C#中的`abstract factory`和`simple factory`可以简化对象的创建过程,避免硬编码具体类名。 3. **建造者模式**:将一个复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的表示。C#中的Builder模式适用...
工厂模式提供了一种创建对象的最佳方式,避免了硬编码类名和new操作符。抽象工厂模式则在更大的范围内封装了对象的创建,使得系统独立于具体的产品实现。建造者模式将复杂对象的构建与其表示分离,使得同一种构建...
抽象工厂模式帮助你控制一个应用创建的对象的类,因为一个工厂封装创建产品对象的责任和过程。它将客户和类的实现分离,客户通过他们的抽象接口操纵实例,产品的类名也在具体工厂的实现中被分离,它们不出现在客户...
在深入探讨C#设计模式之前,首先需要回顾一下C#面向对象的基本概念和技术。面向对象编程(Object-Oriented Programming, OOP)是一种编程范式,它通过将数据和行为封装到对象中来简化软件开发和维护。在C#中,类是...
创建型模式关注的是对象的创建方式,旨在提供一种更为灵活的方式来创建对象,避免硬编码具体类名。 - **Abstract Factory(抽象工厂模式)**:提供了一个接口,用于创建一系列相关或相互依赖的对象,而无需指定它们...
工厂模式允许动态地创建对象,而无需直接硬编码具体的类名,这有助于减少代码的耦合度和提高可维护性。在业务逻辑层,可以根据需要创建对应的数据访问对象,而无需知道其具体实现。这种方式使得代码更加模块化,易于...
在C#中,简单工厂模式常用于简化对象的创建,提高代码的可维护性和可扩展性。 在《C#设计模式》第二版中,作者刘伟通过课后习题深入浅出地讲解了这一模式。根据提供的文件名"简单工厂模式习题4"和"简单工厂模式习题...
在C#中,可以使用抽象工厂或者简单工厂模式来创建对象,避免了硬编码类名和依赖关系。 3. 建造者模式(Builder):将复杂对象的构建与表示分离,使得同样的构建过程可以创建不同的表示。C#中的建造者模式常用于创建...
.NET工厂模式程序设计是软件开发中的一个重要概念,它属于设计模式的一种,主要解决对象创建问题。在C#和.NET环境中,工厂模式被广泛应用于构建可扩展且易于维护的代码结构。下面将详细介绍工厂模式以及其在.NET开发...
总之,这个"winform 反射工厂模式的实现源码"展示了如何在WinForm应用程序中利用反射动态创建对象,并通过工厂模式组织代码,以实现更加模块化和动态的设计。这种技术在处理复杂的软件系统时特别有用,因为它们允许...
在《设计模式—C#语言实现》这份技术文档中,我们深入探讨了设计模式如何应用于C#编程语言,特别是在创建相关或依赖对象时如何避免硬编码具体的类名,从而提高代码的灵活性和可维护性。 ### 抽象工厂模式(Abstract ...
工厂模式使代码更加灵活,避免了硬编码具体类名。分为简单工厂、工厂方法和抽象工厂三种类型。 3. **观察者模式**:定义对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并...
抽象工厂模式是一种创建型设计模式,它提供了一种创建对象家族的方式,这些对象都属于一个大的类别,且具有相关性。在收银系统中,可能会有多种类型的支付方式,如现金支付、信用卡支付等,每种支付方式可以看作一个...
1. 工厂模式:提供一个创建对象的接口,使子类决定实例化哪一个类。这有助于避免硬编码类名,增加代码的灵活性。 2. 单例模式:确保一个类只有一个实例,并提供一个全局访问点。在多线程环境中,C# 3.0提供了更安全...