动态组织和调用 C# 方法
本文关键字:方法 调用 动态 | 更新日期: 2023-09-27 18:34:47
#相对较新,正在寻找执行以下操作的"最佳实践"方法:
我有一个带有公共方法的类(传感器(,例如"CommunicationStart","DoThing1","DoThing2"。
在调用这些方法之前,该类配置了一个传感器"模型">
根据模型,公共方法应采用不同的代码路径。 如果我静态地执行此操作,则在每个公共方法中打开模型就可以了。
我想动态地执行此操作以帮助长期支持。 在每个公共方法中包装动态加载的代码的"正确"方法是什么? 反射? 代表? 动态加载的函数应驻留在何处? 他们应该与公共包装器处于同一类中,还是驻留在新类中?
我正在寻找更多"正确"的方法和组织,而不是语法,因为我可以自己解决这个问题。 提前非常感谢!
我希望我正确理解了你的问题。以下是我为常用方法和传感器实现创建可扩展系统的方法:
用于处理公共代码(传感器公共方法需要(:
如果程序集是动态加载的,则可以使用 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");
}
// (...)
}
正确的传感器类别的实例化可以通过工厂设计模式来完成......根据您的需求,这有很多可能性。我建议尽可能少地使用反射,因为如果发生错误,它总是在一个非常棘手的代码中,而问题的根源往往很远......除非所有异常和错误都非常小心地处理,并带有有意义的错误消息(开发人员可以在几秒钟内找到问题的真正来源(。
此致敬意