4

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

所以我有这样的事情:

foreach (Type classType in protocolAssembly.GetTypes())
{
    if (classType.BaseType == typeof(ProtocolRequestHandler))
    {
        if (supportedRequestsMap.Contains(classType.Method))
        {
            // error: that method is already implemented!
        }

        supportedRequestsMap.Add(classType.Method, typeof(classType));
    }
}

只要声明了它处理的请求方法,就会在服务重新启动时添加一个新类。

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

有什么方法可以强制一个属性在继承类中设置它的值?

有没有一种更简洁的方法可以进行这种动态加载?我应该使用属性来确定继承类的支持方法吗?

4

2 回答 2

4

您应该依赖接口作为插件应该实现哪些方法的合同。
一个(有点旧,但仍然非常相关)很好的教程可以在这里找到

于 2012-12-27T23:56:09.073 回答
0

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

于 2012-12-27T23:59:04.190 回答