c#模型抽象和泛型,像Java一样投射未知的泛型

时间:2016-06-26 16:12:22

标签: java c# generics

基本Java方式

class SomeModelController {

    public void makeSomeRequest<T extends BaseJsonClass>(Type type, RequestCallback requestCallback) {
        // Do request stuff.
        requestCallback.success(Type.cast(sucessObject));
    }
}

// Some code
ModelController.makeRequest<UserLoginResponse>(UserLoginResponse.class, new RequestCallback() {
    public void success(UserLoginResponse sucessObject) {
        // Object is now treated like response.
    }
}

我知道C#没有类型的擦除器;所以我可以使用T(Generic as?) 我的C#课程和我在哪里挣扎:

public class Response<T> {

    private Action<T> success;
    private Action<FailedReason> failed;

    public Response(Action<T> success, Action<FailedReason> failed) {
        this.success = success;
        this.failed = failed;
    }

    public void Success<T>(T objectSuccess) {
        // ?? How to convert success object to type?
        success.Invoke(objectSuccess);
    }

    public void Failed(FailedReason failedReason) {
        failed.Invoke(failedReason);
    }

}

修改1 我在编译时收到了编译器的以下抱怨: I'm getting "Cannot implicitly convert T to T"

1 个答案:

答案 0 :(得分:2)

您只需致电

即可
public void Success(T objectSuccess) {
    success(objectSuccess);
}

objectSuccess的类型为T。这正是Action<T> success期望的参数。无需转换。

您可以将success视为一个声明如下的方法:

void success(T arg)
{
}

正如Jorn Vernee所说,从<T>移除Success<T>。您不需要此方法的泛型类型参数,因为它使用类的泛型类型参数。如果由于某种原因,您需要为类和方法使用不同的泛型类型参数,则必须为它们指定不同的名称。但情况并非如此。