【问题标题】:Organizing and Calling C# Methods Dynamically动态组织和调用 C# 方法
【发布时间】:2014-12-30 23:20:10
【问题描述】:

对 C# 比较陌生,正在寻找执行以下操作的“最佳实践”方式:

我有一个带有公共方法的类(传感器),例如“CommunicationStart”、“DoThing1”、“DoThing2”。

在调用这些方法之前,该类配置了一个传感器“模型”

根据模型,公共方法应该采用不同的代码路径。如果我要静态地执行此操作,则在每个公共方法中打开模型就可以了。

我想动态地执行此操作以帮助获得长期支持。在每个公共方法中包装动态加载的代码的“正确”方法是什么?反射?代表?动态加载的函数应该放在哪里?它们应该与其公共包装器在同一个类中,还是位于一个新类中?

我更多的是寻找“正确”的方法和组织,而不是语法,因为我可以自己解决。非常感谢!

【问题讨论】:

  • 这个问题太抽象了,无法回答。你预计会有什么样的差异?在某些情况下,值得让不同的类实现相同的接口,并从工厂返回一个具体实例。在某些情况下,您可能希望传入该类将调用的承包商对象,每个对象都做不同的事情,但都共享一个接口。有时一个简单的开关是最好的。
  • 为什么不能创建一个继承这个旧类的新类?
  • 我明白了。您建议“传感器”成为我定义需要实现的方法的基类,然后在每个“模型”的子类中覆盖它们?如果两个“模型”有一堆具有相同实现的方法,我将如何避免代码重复?
  • 所以我现在喜欢的解决方案是为我定义“公共方法”=“模型特定方法”的每个“模型”创建一个查找表。然后,我将使用反射将动态调用包装到公共方法中的“模型特定方法”中。这将允许我在模型之间共享某些方法,同时可以灵活地根据需要为做不同事情的新模型定义新的代码路径。现在,我将把“特定于模型的”方法与传感器放在同一个类中。 C# 社区如何看待这一点?可以接受吗?还是不寻常?
  • 看起来像是strategy pattern的候选人

标签: c# dynamic reflection


【解决方案1】:

希望我正确理解了您的问题。 以下是我为常用方法和传感器实现创建可扩展系统的方法:

用于处理通用代码(传感器公共方法需要):

如果您的程序集是动态加载的,您可以使用反射找出所有实现公共接口的类,例如ISensorMethod(在公共程序集中)。所有组件都必须知道它。 这个接口可以有一个方法,比如说execute(),以及一个能够识别该方法的标识符,例如string Key { get; }。 事实上,每个可重用代码都在一个单独的类中(每个方法一个类)。

您的主代码(加载程序集的代码)可以在内部保留 List<ISensorMethod> 以引用所有已加载的可重用方法。

对于“传感器”类:

您可以执行相同的系统:动态加载程序集,找出所有“Sensor”或“ISensor”类。 公共继承的传感器方法可以通过它们的 Key 调用可重用的方法。 为此,您可以在每个 Sensor 类(在构造函数中或使用属性)中注入依赖项,例如 IMethodCaller,以允许它们通过键调用方法。

public interface IMethodCaller
{
   void CallMethodByKey(string key);
}

然后这里有一个使用的可能性:

public class ElectricSensor : Sensor
{
   public ElectricSensor(IMethodCaller caller): base(caller)
   {
   }

   public void CommunicationStart()
   {
      base.Caller.CallMethodByKey("START_COMMON");
      base.Caller.CallMethodByKey("INITIALIZE_ELECTRIC");
   }

  // (...) 
}

正确的 Sensor 类的实例化可以通过工厂设计模式来完成... 这有很多可能性,具体取决于您的需求。 我建议尽可能少地使用反射,因为如果发生错误,它总是在一个非常棘手的代码中,而且问题的根源往往很远......除非所有异常和错误都用有意义的错误消息非常小心地处理(开发人员可以在几秒钟内找到问题的真正根源)。

最好的问候,

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-22
    • 2015-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多