`
498320858
  • 浏览: 393144 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

c# 工厂模式 类名 转对象

    博客分类:
  • 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                     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#工厂模式结合反射+配置文件+外观模式实例

    工厂模式是一种创建型设计模式,它提供了一种创建对象的最佳方式,通过创建一个工厂类来生产特定类型的对象,而不是直接实例化。在C#中,我们可以定义一个抽象工厂类,包含创建产品对象的抽象方法,然后创建多个...

    C#中简单工厂模式实例

    在软件设计领域,设计模式是一种在特定情境下解决常见问题的最佳实践。简单工厂模式是创建型设计模式之一...在实际开发中,尤其是在需要动态选择对象类型或避免硬编码类名的情况下,简单工厂模式是一个非常有效的工具。

    C#工厂模式应用源代码

    《C#工厂模式应用源代码》 工厂模式是软件设计模式中的一个经典模式,它在.NET框架和C#编程中有着广泛的应用。本示例旨在帮助开发者深入理解工厂模式的概念和实际运用,对于那些对工厂设计模式感到困惑的朋友们,这...

    visual c#设计模式

    C#中的`abstract factory`和`simple factory`可以简化对象的创建过程,避免硬编码具体类名。 3. **建造者模式**:将一个复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的表示。C#中的Builder模式适用...

    C#设计模式与源码,高手必修

    工厂模式提供了一种创建对象的最佳方式,避免了硬编码类名和new操作符。抽象工厂模式则在更大的范围内封装了对象的创建,使得系统独立于具体的产品实现。建造者模式将复杂对象的构建与其表示分离,使得同一种构建...

    C#抽象工厂实例,设计模式

    抽象工厂模式帮助你控制一个应用创建的对象的类,因为一个工厂封装创建产品对象的责任和过程。它将客户和类的实现分离,客户通过他们的抽象接口操纵实例,产品的类名也在具体工厂的实现中被分离,它们不出现在客户...

    C#設計模式大全

    在深入探讨C#设计模式之前,首先需要回顾一下C#面向对象的基本概念和技术。面向对象编程(Object-Oriented Programming, OOP)是一种编程范式,它通过将数据和行为封装到对象中来简化软件开发和维护。在C#中,类是...

    GOF设计模式C#加强版

    创建型模式关注的是对象的创建方式,旨在提供一种更为灵活的方式来创建对象,避免硬编码具体类名。 - **Abstract Factory(抽象工厂模式)**:提供了一个接口,用于创建一系列相关或相互依赖的对象,而无需指定它们...

    c#三层工厂模式源码源码

    工厂模式允许动态地创建对象,而无需直接硬编码具体的类名,这有助于减少代码的耦合度和提高可维护性。在业务逻辑层,可以根据需要创建对应的数据访问对象,而无需知道其具体实现。这种方式使得代码更加模块化,易于...

    简单工厂模式.zip

    在C#中,简单工厂模式常用于简化对象的创建,提高代码的可维护性和可扩展性。 在《C#设计模式》第二版中,作者刘伟通过课后习题深入浅出地讲解了这一模式。根据提供的文件名"简单工厂模式习题4"和"简单工厂模式习题...

    C#设计模式

    在C#中,可以使用抽象工厂或者简单工厂模式来创建对象,避免了硬编码类名和依赖关系。 3. 建造者模式(Builder):将复杂对象的构建与表示分离,使得同样的构建过程可以创建不同的表示。C#中的建造者模式常用于创建...

    .net工厂模式程序设计

    .NET工厂模式程序设计是软件开发中的一个重要概念,它属于设计模式的一种,主要解决对象创建问题。在C#和.NET环境中,工厂模式被广泛应用于构建可扩展且易于维护的代码结构。下面将详细介绍工厂模式以及其在.NET开发...

    winform 反射工厂模式的实现源码

    总之,这个"winform 反射工厂模式的实现源码"展示了如何在WinForm应用程序中利用反射动态创建对象,并通过工厂模式组织代码,以实现更加模块化和动态的设计。这种技术在处理复杂的软件系统时特别有用,因为它们允许...

    设计模式c#语言实现

    在《设计模式—C#语言实现》这份技术文档中,我们深入探讨了设计模式如何应用于C#编程语言,特别是在创建相关或依赖对象时如何避免硬编码具体的类名,从而提高代码的灵活性和可维护性。 ### 抽象工厂模式(Abstract ...

    设计模式——刘伟

    工厂模式使代码更加灵活,避免了硬编码具体类名。分为简单工厂、工厂方法和抽象工厂三种类型。 3. **观察者模式**:定义对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并...

    C#反射\商场收银系统源码(C#抽象工厂反射技术)

    抽象工厂模式是一种创建型设计模式,它提供了一种创建对象家族的方式,这些对象都属于一个大的类别,且具有相关性。在收银系统中,可能会有多种类型的支付方式,如现金支付、信用卡支付等,每种支付方式可以看作一个...

    c#3.0designpatterns

    1. 工厂模式:提供一个创建对象的接口,使子类决定实例化哪一个类。这有助于避免硬编码类名,增加代码的灵活性。 2. 单例模式:确保一个类只有一个实例,并提供一个全局访问点。在多线程环境中,C# 3.0提供了更安全...

Global site tag (gtag.js) - Google Analytics