C#反射机制实现开闭原则的简单工厂模式

简介: C#反射机制实现开闭原则的简单工厂模式


C#反射

特性(Attribute)

**特性(Attribute)**是用于在运行时传递程序中各种元素(比如类、方法、结构、枚举、组件等)的行为信息的声明性标签。可以看作我们程序的注释,包含我们程序的一些信息,但是这个注释在运行时其他地方也能看到,并获取到。

using System;
public class MyClass
{
   [Obsolete("Don't use OldMethod, use NewMethod instead", true)]
   static void OldMethod()
   {
      Console.WriteLine("It is the old method");
   }
   static void NewMethod()
   {
      Console.WriteLine("It is the new method");
   }
   public static void Main()
   {
      OldMethod();
   }
}

反射(Reflection)

反射(Reflection)最常见的用途就是它允许在运行时查看特性(attribute)信息;以及允许审查集合中的各种类型,以及实例化这些类型。

例如:

using System;
[AttributeUsage(AttributeTargets.All)]
public class HelpAttribute : System.Attribute//这是一个自定义的特性
{
   public readonly string Url;
   public string Topic  // Topic 是一个命名(named)参数
   {
      get { return topic; } set { topic = value; }
   }
   public HelpAttribute(string url)  // url 是一个定位(positional)参数
   {
      this.Url = url;
   }
   private string topic;
}
[HelpAttribute("Information on the class MyClass")]//创建MyClass的特性
class MyClass
{
}
namespace AttributeAppl
{
   class Program
   {
      static void Main(string[] args)
      {
         System.Reflection.MemberInfo info = typeof(MyClass);//通过typeof反射机制获取MyClass的类型
         object[] attributes = info.GetCustomAttributes(true);//获取特性
         for (int i = 0; i < attributes.Length; i++)
         {
            System.Console.WriteLine(attributes[i]);//打印特性 “HelpAttribute”
         }
         Console.ReadKey();
      }
   }
}

运行结果:

HelpAttribute

简单工厂模式&反射

结构型设计模式-单例模式/工厂模式/抽象工厂

产品类

public abstract class Product
{
  protected ControllerBase(string typeName)
  {
      TypeName = typeName;
  }
  public abstract void Show();
};
// 产品 A
public class ProductA : Product
{
  public class ProductA : base("产品A"){}
  public override void Show()
  {
      System.Console.WriteLine("Product A.");
  }
};
// 产品 B
public class ProductB Product
{
  public class ProductA : base("产品B"){}
  public override void Show()
  {
      System.Console.WriteLine("Porduct B.");
  }
};

工厂类

// 工厂
public class Factory : InstanceBase<ControllerFactory>
{
  public Factory()
  {
    var types = Assembly.GetExecutingAssembly().GetExportedTypes().Where(p => typeof(Product).IsAssignableFrom(p) && !p.IsAbstract && p.IsClass).ToList();
    types.ForEach(p =>
    {
        var instance = (Product)Activator.CreateInstance(p);
        _productItems.Add(instance.TypeName, p);
    });
  }
  public Product CreateProduct(string typeName)
  {
    return (Product)Activator.CreateInstance(_productItems[typeName]);
  }
private Dictionary<string, Type> _productItems = new Dictionary<string, Type>();
};

主函数

class Program
 {
    static void Main(string[] args)
    {
       ControllerFactory.Instance().CreateProduct("产品A");
       ControllerFactory.Instance().CreateProduct("产品B");
    }
 }

加入需要新增产品类型的话,就可以直接新增继承产品类。而不需要修改工厂类。

目录
相关文章
|
4月前
|
存储 C# 开发者
C# | 通过反射将对象属性展示在TreeView中
在编程过程中,我们经常需要处理复杂的对象和数据结构。将这些数据结构展示在UI界面上是很有用的,可以帮助开发者更好地理解和分析数据。 而TreeView作为一种常见的控件,可以以树状结构的方式展示数据,非常适合用于展示层次化的对象。 本文将介绍如何使用TreeView控件展示一个对象,并且可以动态处理对象中的属性和子对象。通过本文的学习,您将学会如何更好地理解和展示数据,提高编程效率。
34 0
C# | 通过反射将对象属性展示在TreeView中
|
4月前
|
安全 C# 图形学
C#的反射机制
C#的反射机制
|
5月前
|
存储 Java API
C#反射(Reflection)详解
反射是.NET中的重要机制,通过反射可以得到*.exe或*.dll等程序集内部的接口、类、方法、字段、属性、特性等信息,还可以动态创建出类型实例并执行其中的方法。反射指程序可以访问、检测和修改它本身状态或行为的一种能力。通俗一点:我们在获取其他实体类的字段名或实列,只能获取公有的,而有了反射之后可以获取私有的,可以获取他的基类等等,可以说把家底查得清清楚楚。
31 1
|
7月前
|
开发框架 缓存 安全
C#OOP之十三 组件、程序集与反射
C#OOP之十三 组件、程序集与反射
38 0
|
7月前
|
开发框架 .NET Java
C#下反射动态加载dll后如何卸载?
C#下反射动态加载dll后如何卸载?
|
7月前
|
Oracle 架构师 关系型数据库
C#反射应用之实现动态可配置可扩展框架的简单示例
C#反射应用之实现动态可配置可扩展框架的简单示例
|
7月前
|
Java 关系型数据库 MySQL
C#反射(Reflection)详解及于java反射的对比
C#反射(Reflection)详解及于java反射的对比
|
9月前
|
C# 数据安全/隐私保护
C#机房重构-修改密码之职责链模式+反射
C#机房重构-修改密码之职责链模式+反射
42 0
|
10月前
|
运维 Devops C#
【C#编程最佳实践 十七】反射工厂最佳实践
【C#编程最佳实践 十七】反射工厂最佳实践
58 0
|
缓存 IDE API
C#反射与特性(五):主类型成员操作
C#反射与特性(五):主类型成员操作
337 0
C#反射与特性(五):主类型成员操作