我正在使用具有以下(缩写)方法的第三方库类:
public void DoSomethingAsync(Action<ResultInfo> callback)
我没有在我的应用程序代码项目中引用这个第三方库,而是创建了一个抽象第三方依赖项的包装类。所以,我要做的是有一个如下所示的包装器方法:
public void MyDoSomethingAsync(Action<MyResultInfo> callback)
{
this.wrappedClass.DoSomethingAsync(callback);
}
问题是我需要将callback
参数从Action<MyResultInfo>
转换为Action<ResultInfo>
。这可能是使用自定义隐式强制转换运算符,还是有人可以推荐的替代方法?
答案 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
。