当接口方法参数是抽象的时,避免类型检查

本文关键字:类型 检查 抽象的 接口 方法 参数 | 更新日期: 2023-09-27 17:55:31

我的界面看起来像这样:

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)

但是如果我这样做,我就不会实现接口。

当接口方法参数是抽象的时,避免类型检查

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

我会建议这样的事情:

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

然后FooHandler会变成:

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

现在一切就绪,您不必再检查类型了。编译器是安全的。