Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用反射和抽象对象动态加载类?_C#_Oop_Dynamic_Reflection - Fatal编程技术网

C# 如何使用反射和抽象对象动态加载类?

C# 如何使用反射和抽象对象动态加载类?,c#,oop,dynamic,reflection,C#,Oop,Dynamic,Reflection,我正在构建一个协议处理程序。该协议可能支持一组未知的请求类型,我将使用一个类来实现每个请求类型。这些请求处理程序类将扩展一个基本处理程序类。我正在尝试构建系统,以便支持新的请求类型,我所需要做的就是为此添加一个类,然后重新编译/部署/重新启动服务 所以我有这样的想法: foreach(protocolAssembly.GetTypes()中的类型classType) { if(classType.BaseType==typeof(ProtocolRequestHandler)) { if(sup

我正在构建一个协议处理程序。该协议可能支持一组未知的请求类型,我将使用一个类来实现每个请求类型。这些请求处理程序类将扩展一个基本处理程序类。我正在尝试构建系统,以便支持新的请求类型,我所需要做的就是为此添加一个类,然后重新编译/部署/重新启动服务

所以我有这样的想法:

foreach(protocolAssembly.GetTypes()中的类型classType)
{
if(classType.BaseType==typeof(ProtocolRequestHandler))
{
if(supportedRequestsMap.Contains(classType.Method))
{
//错误:该方法已实现!
}
supportedRequestsMap.Add(classType.Method,typeof(classType));
}
}
在服务重新启动时,只要声明了它所处理的请求方法,就会选择添加新类

如何在编译时通过基类ProtocolRequestHandler强制实现属性方法?我不想使用“Null”或“Unknown”方法类型,也不想抛出异常,也不想在扩展类的名称中固有地指定支持的协议请求类型(我想调用任何我喜欢的类)

是否有某种方法可以强制在继承类中设置属性的值


有没有一种更干净的方法可以实现这种动态加载?我应该使用属性来确定继承类所支持的方法吗?

您应该依赖接口来确定插件应该实现哪些方法。

如果您使用的是基类,那么为什么不创建所需的方法作为抽象方法(或者虚拟方法,如果可能的话,指定默认实现)呢。这将确保该方法存在于继承的类中。我相信,如果您正在进行反思并编写自己的协议处理程序,您可能已经知道这一点,但我不确定是否有更好的方法来获得您想要的内容。

我已编辑了您的标题。请看“”,其中的共识是“不,他们不应该”。谢谢,出于某种原因,我认为属性不能与接口一起工作。一旦我知道要寻找什么,我就找到了明确的指导。是的,我希望避免这种情况,只是因为在每个类中实现一个方法来返回一个固定的字符串看起来像样板。即使通过接口使用属性也不是那么好。如果我可以使用属性,并在编译时强制执行某些属性的存在,那就太好了(我现在可能只是为了兴趣而去调查一下)。我很想看看你在属性路径上的想法,如果你找到一个好的模式,请编辑这篇文章。