0

1. 我有一个以对象响应作为参数的函数 DoSomeService。响应是不同的类,内部代码决定在运行时动态使用哪一个。

2. 我有一个通用的 Fluent Validator<T>,它接受响应类的类型,然后对其进行验证。

现在,我可以一一进行类型检查:

public override void DoSomeService(object response) {
    object validator = null;
    if (response.GetType()==typeof(TypeA_Response)) validator= new Validator<TypeA_Response>();
    if (response.GetType()==typeof(TypeB_Response)) validator= new Validator<TypeB_Response>();
    if (response.GetType()==typeof(TypeC_Response)) validator= new Validator<TypeC_Response>();
    //......
    if (response.GetType()==typeof(TypeX_Response)) validator= new Validator<TypeX_Response>();
        if (validator.IsValid) {
        //do more stuff ...
    }
}

但这并不好,尤其是当我有很多回复时。我想要一些简短而通用的东西。

//response could be TypeA_Response, TypeB_Response, TypeX_Response
public override void DoSomeService(object response) {
    var validator = new Validator<T>();
    if (validator.IsValid) {
        //do more stuff ...
    }
}

当然,这行不通,因为我需要为 Fluent Validator 定义 T。如何检测什么类型是“对象响应”并在运行时将其动态填充到 T 中?

或者我如何避免一起做这一切,并为我的验证器<T>提供更好的结构?

请注意,我无法更改基础服务类和 DoSomeService 函数签名,它是来自 3rd 方包的覆盖函数。

4

2 回答 2

2

如果您真的希望这是动态的,最好的方法是使用反射

void DoSomething(object response)
{
    var type = typeof(Validator<>);
    var boundType = type.MakeGenericType(response.GetType());
    var validator = Activator.CreateInstance(boundType);
}

即使使用此解决方案,您也无法Validator<T>在此上下文中使用,因为您仍然不知道是什么TT必须静态定义才能以这种方式使用。您将需要分解Validator<T>为泛型和非泛型基类型,并在DoSomething方法中使用非泛型类型

Validator valdiator = Activator.CreateInstance(boundType);
于 2013-03-09T00:50:18.757 回答
1

这并不是泛型的真正用途。相反,您将拥有一个具有执行验证的虚拟方法的基类,或者要求具体类型实现一个具有验证方法的特定接口。

于 2013-03-09T00:48:42.733 回答