避免类型检查时接口方法的参数是抽象(Avoiding type checking when inte

2019-10-23 09:14发布

我的界面看起来是这样的:

public interface UserHandler
{
    CheckUsernameResponse CheckUsername(CheckUsernameRequest request);
}

在签名的请求和响应类型是抽象类,给人的类似用法:

var fooHandler = new FooUserHandler();

var fooResponse = fooHandler.CheckUsername( new FooRequest { id = 1, FooProperty = "abc" });

要么

var barHandler = new BarUserHandler();

var barResponse = barHandler.CheckUserName( new BarRequest { id = 2, BarProperty = true });

什么我最终要做的是必须有多个UserHandler实现的能力,每一个都有自己的请求/响应类型具有不同属性的版本,但有一个共同的基本类型。 我这样做是为了避免不得不进行更改消费WCF服务的情况下,外部用户提供的变化和新的供应商需要在方法调用不同的属性。

铭记有可能通过任何类型从抽象类继承,也就是说我可以通过一个BarRequest成FooHandler,我怎么能保证只有正确/预期的类型作为参数传递,而不诉诸:

public CheckUsernameResponse CheckUsername(CheckUsernameRequest request)

    if (request.GetType() != typeOf(FooRequest))
        throw new ArgumentException("Wrong type!");

    var fooRequest = request as FooRequest;

这种感觉错了,所以我会很感激的任何反馈到具体的问题,一般的方法。

我真正想要的是一个方法签名:

public FooResponse CheckUsername(FooRequest request)

但如果我这样做,我没有实现的接口。

Answer 1:

在我看来,界面应该使用泛型,所以你可以依靠接口的实现。

我建议是这样的:

public interface UserHandler<TRequest, TResponse> where TRequest : CheckUsernameRequest
                                                  where TResponse : CheckUsernameResponse
{ }

然后FooHandler将成为:

public class FooHandler : UserHandler<FooRequest, FooResponse>
{ }

现在,你都设置,你不必检查的类型了。 您编译安全。



文章来源: Avoiding type checking when interface method parameters are abstract
标签: c# oop interface