.net 隐式作用
我正在使用具有以下(缩写)方法的第三方库类:.net 隐式作用,.net,delegates,casting,.net,Delegates,Casting,我正在使用具有以下(缩写)方法的第三方库类: public void DoSomethingAsync(操作回调) 我没有在我的应用程序代码项目中引用这个第三方库,而是创建了一个抽象第三方依赖项的包装器类。所以,我想做的是有一个包装器方法,如下所示: public void MyDoSomethingAsync(Action<MyResultInfo> callback) { this.wrappedClass.DoSomethingAsync(callback); }
public void DoSomethingAsync(操作回调)
我没有在我的应用程序代码项目中引用这个第三方库,而是创建了一个抽象第三方依赖项的包装器类。所以,我想做的是有一个包装器方法,如下所示:
public void MyDoSomethingAsync(Action<MyResultInfo> callback)
{
this.wrappedClass.DoSomethingAsync(callback);
}
public void MyDoSomethingAsync(操作回调)
{
this.wrappedClass.DoSomethingAsync(回调);
}
问题是我需要将
回调
参数从操作
转换为操作
。使用自定义隐式强制转换运算符可以实现这一点吗?或者有人可以推荐其他方法吗?不,您不能直接这样做,即使MyResultInfo
派生自ResultInfo
;此处不适用,因为操作
将无法处理从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);
}
public void MyDoSomethingAsync(操作回调)
{
//创建将转换ResultInfo的操作
//进入MyResultInfo,然后传递到
//班级。
//首先创建操作。
行动a=ri=>{
//将ri翻译成MyResultInfo。
MyResultInfo mri=(此处翻译);
//使用转换后的结果调用回调。
磁共振成像;
};
//将操作传递给包装类。
这个.wrappedClass.DoSomethingAsync(a);
}
问题在于,您想要制作的内容可能会导致不一致。我假设MyResultInfo
是从ResultInfo
派生的,因为否则它就没有任何意义
现在回到不一致性。假设您有委托操作回调
。调用代码可以这样调用它:callback(newmyresultinfo())编码>并调用您的操作
,它将正常工作。但是想象一下它是这样调用的:callback(newresultinfo())
,Action
允许它,但它会产生异常,因为ResultInfo
不能强制转换为MyResultInfo
我倾向于不同意第一条语句,因为与委托相反,操作
可以转换为操作
第二件事是,您将点链接到非通用代理对冲,这不适用于操作
,通用代理对冲仅在.net 4.0中引入。现在我完全同意您的答案。但我仍然认为这是问题本身的设计缺陷。有人问如何做错事。
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);
}