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");
    }
 }

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

目录
相关文章
|
6月前
|
数据采集 API 开发工具
Baumer工业相机堡盟工业相机如何通过NEOAPISDK设置软件触发模式(C#)
Baumer工业相机堡盟工业相机如何通过NEOAPISDK设置软件触发模式(C#)
77 1
|
29天前
|
设计模式 程序员 C#
C# 使用 WinForm MDI 模式管理多个子窗体程序的详细步骤
WinForm MDI 模式就像是有超能力一般,让多个子窗体井然有序地排列在一个主窗体之下,既美观又实用。不过,也要小心管理好子窗体们的生命周期哦,否则一不小心就会出现一些意想不到的小bug
|
2月前
|
设计模式 开发框架 前端开发
MVC 模式在 C# 中的应用
MVC(Model-View-Controller)模式是广泛应用于Web应用程序开发的设计模式,将应用分为模型(存储数据及逻辑)、视图(展示数据给用户)和控制器(处理用户输入并控制模型与视图交互)三部分,有助于管理复杂应用并提高代码可读性和维护性。在C#中,ASP.NET MVC框架常用于构建基于MVC模式的Web应用,通过定义模型、控制器和视图,实现结构清晰且易维护的应用程序。
51 2
|
3月前
|
前端开发 开发者 C#
深度解析 Uno Platform 中的 MVVM 模式:从理论到实践的全方位指南,助你轻松掌握通过 C# 与 XAML 构建高效可维护的跨平台应用秘籍
【8月更文挑战第31天】本文详细介绍如何在优秀的跨平台 UI 框架 Uno Platform 中实施 MVVM(Model-View-ViewModel)模式,通过一个简单的待办事项列表应用演示其实现过程。MVVM 模式有助于分离视图层与业务逻辑层,提升代码组织性、易测性和可维护性。Uno Platform 的数据绑定机制使视图与模型间的同步变得高效简便。文章通过构造 `TodoListViewModel` 类及其相关视图,展示了如何解耦视图与模型,实现动态数据绑定及命令处理,从而提高代码质量和开发效率。通过这一模式,开发者能更轻松地构建复杂的跨平台应用。
54 0
|
3月前
|
C#
WPF/C#:程序关闭的三种模式
WPF/C#:程序关闭的三种模式
62 0
|
3月前
|
设计模式 前端开发 C#
WPF/C#:理解与实现WPF中的MVVM模式
WPF/C#:理解与实现WPF中的MVVM模式
186 0
|
5月前
|
C#
WPF/C#:程序关闭的三种模式
WPF/C#:程序关闭的三种模式
78 3
|
5月前
|
机器学习/深度学习 开发框架 .NET
技术经验解读:【c#】反射真的很可怕吗?
技术经验解读:【c#】反射真的很可怕吗?
|
6月前
|
API C# 数据库
C#反射详解
C#反射详解
62 0
|
6月前
|
开发框架 .NET C#
C# 10.0中的扩展属性与模式匹配:深入解析
【1月更文挑战第20天】C# 10.0引入了众多新特性,其中扩展属性与模式匹配的结合为开发者提供了更强大、更灵活的类型检查和代码分支能力。通过这一特性,开发者可以在不修改原始类的情况下,为其添加新的行为,并在模式匹配中利用这些扩展属性进行更精细的控制。本文将详细探讨C# 10.0中扩展属性与模式匹配的工作原理、使用场景以及最佳实践,帮助读者更好地理解和应用这一新功能。