动态组织和调用 C# 方法

本文关键字:方法 调用 动态 | 更新日期: 2023-09-27 18:34:47

C

#相对较新,正在寻找执行以下操作的"最佳实践"方法:

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

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

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

我想动态地执行此操作以帮助长期支持。 在每个公共方法中包装动态加载的代码的"正确"方法是什么? 反射? 代表? 动态加载的函数应驻留在何处? 他们应该与公共包装器处于同一类中,还是驻留在新类中?

我正在寻找更多"正确"的方法和组织,而不是语法,因为我可以自己解决这个问题。 提前非常感谢!

动态组织和调用 C# 方法

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

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

如果程序集是动态加载的,则可以使用 Reflection 查找实现公共接口的所有类,例如 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");
   }
  // (...) 
}

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

此致敬意