当接口方法参数是抽象时避免类型检查
Avoiding type checking when interface method parameters are abstract
我的界面是这样的:
public interface UserHandler
{
CheckUsernameResponse CheckUsername(CheckUsernameRequest request);
}
签名中的请求和响应类型是抽象的 classes,给出了类似这样的用法:
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 实现,每个实现都有自己的 request/response 类型版本,具有不同的属性但具有共同的基类型。我这样做是为了避免在外部用户提供者发生变化并且新的提供者在方法调用中需要不同的属性时必须更改使用的 WCF 服务。
请记住,可以传递从抽象 class 继承的任何类型,即我可以将 BarRequest 传递给 FooHandler,我如何确保只传递 correct/expected 类型作为参数在不求助于:
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>
{ }
现在一切就绪,您不必再检查类型了。你是编译器安全的。
我的界面是这样的:
public interface UserHandler
{
CheckUsernameResponse CheckUsername(CheckUsernameRequest request);
}
签名中的请求和响应类型是抽象的 classes,给出了类似这样的用法:
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 实现,每个实现都有自己的 request/response 类型版本,具有不同的属性但具有共同的基类型。我这样做是为了避免在外部用户提供者发生变化并且新的提供者在方法调用中需要不同的属性时必须更改使用的 WCF 服务。
请记住,可以传递从抽象 class 继承的任何类型,即我可以将 BarRequest 传递给 FooHandler,我如何确保只传递 correct/expected 类型作为参数在不求助于:
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>
{ }
现在一切就绪,您不必再检查类型了。你是编译器安全的。