在转换为Generic时忽略T.

时间:2015-11-30 22:42:17

标签: c# generics

我正在尝试减少一些额外的电话,而我将我的5分钟问题解决了30分钟的问题。有没有办法在不知道其泛型类型的情况下强制转换对象?在下面的代码中,我想Complete<T, T2>只是Complete<T2>

public void Complete<T, T2>(object sender, RunWorkerCompletedEventArgs args) 
    where T2 : new()
{
    ServiceContainer<T, T2> callback = (ServiceContainer<T, T2>)args.Result;
    StateManager.BackgroundWorker result = (StateManager.BackgroundWorker)sender;
    callback.func(result.state, callback.response);
}

所以我希望它看起来像这样:

public void Complete<T2>(object sender, RunWorkerCompletedEventArgs args) 
    where T2 : new()
{
    ServiceContainer<object, T2> callback = (ServiceContainer<object, T2>)args.Result;
    StateManager.BackgroundWorker result = (StateManager.BackgroundWorker)sender;
    callback.func(result.state, callback.response);
}

2 个答案:

答案 0 :(得分:3)

除非args.Result中的值object作为其第一个通用参数,否则您将无法执行此操作。

根据定义,您不能将类型强制转换为您不知道的类型,因为正在演示的是显式告诉编译器该对象的类型应该在编译时被视为

答案 1 :(得分:3)

您可以像这样使用动态语言运行时:

public void Complete<T2>(object sender, RunWorkerCompletedEventArgs args) 
    where T2 : new()
{
    dynamic callback = args.Result;
    dynamic result = sender;
    callback.func(result.state, callback.response);
}

如果您在方法中没有使用T2(就像您的示例中所示),您可以删除它并使您的方法不是通用的。