动态组织和调用C#方法

时间:2014-12-19 18:12:17

标签: c# dynamic reflection

相对较新的C#,寻找"最佳实践"做到以下几点的方式:

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

在调用这些方法之前,该类配置了传感器" Model"

基于该模型,公共方法应采用不同的代码路径。如果我要静态地执行此操作,则在每个公共方法中切换模型都可以解决问题。

我想动态地这样做,以帮助长期支持。什么是"适当的"在每个公共方法中包装动态加载的代码的方法?反射?代表们?动态加载的函数应该驻留在哪里?他们应该和他们的公共包装一样在同一个班级,还是住在一个新的班级?

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

1 个答案:

答案 0 :(得分:1)

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

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

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

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

对于&#34;传感器&#34;类:

你可以做同样的系统:动态加载程序集,找出所有&#34; Sensor&#34;或&#34; ISensor&#34;类。 公共继承的传感器方法可以通过其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");
   }

  // (...) 
}

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

致以最诚挚的问候,