对Action的隐式演员

时间:2011-05-09 14:56:28

标签: .net delegates casting

我正在使用具有以下(缩写)方法的第三方库类:

public void DoSomethingAsync(Action<ResultInfo> callback)

我没有在我的应用程序代码项目中引用这个第三方库,而是创建了一个抽象第三方依赖项的包装类。所以,我要做的是有一个如下所示的包装器方法:

public void MyDoSomethingAsync(Action<MyResultInfo> callback)
{
    this.wrappedClass.DoSomethingAsync(callback);
}

问题是我需要将callback参数从Action<MyResultInfo>转换为Action<ResultInfo>。这可能是使用自定义隐式强制转换运算符,还是有人可以推荐的替代方法?

2 个答案:

答案 0 :(得分:1)

不,即使MyResultInfo来自ResultInfo,您也无法直接这样做; Action<MyResultInfo>不适用于ResultInfo,因为Action<MyResultInfo>无法处理从Action<ResultInfo>派生的任何实例(因此取消public void MyDoSomethingAsync(Action<MyResultInfo> callback) { // Create the action which will transform ResultInfo // into MyResultInfo and then pass to the wrapped // class. // Create the action first. Action<ResultInfo> a = ri => { // Translate ri into MyResultInfo. MyResultInfo mri = (translate here); // Call the callback with the translated result. callback(mri); }; // Pass the action to the wrapped class. this.wrappedClass.DoSomethingAsync(a); } 取代{{1}}的资格{{1}})

但是,这并不意味着你不能使用适配器,如下所示:

{{1}}

答案 1 :(得分:0)

问题在于您想要制作的内容可能会导致不一致。我假设MyResultInfo来自ResultInfo,因为否则它没有任何意义。

现在回到不一致。想象一下,你有委托Action<ResultInfo> callback。调用代码可以这样称呼它:callback(new MyResultInfo());并调用您的Action<MyResultInfo>,它会正常工作。但想象一下它被称为:callback(new ResultInfo());Action<ResultInfo>允许它,但它会产生异常,因为ResultInfo无法转换为MyResultInfo