接口继承和转换

Mar*_*ier 4 c# inheritance

我创建了一个接口,我从另一个(COM)接口继承:

public interface IDTSComponentMetaData : IDTSComponentMetaData90 { }
Run Code Online (Sandbox Code Playgroud)

就是这样.

这背后的原因是,根据我正在使用的SQL Server版本,基数可能是IDTSComponentMetaData90(2005)或IDTSComponentMetaData100(2008).我不想在代码中有条件地编译对IDTSComponentMetaData90/IDTSComponentMetaData100的每个引用,而是使用版本中性接口,它将简单地包装正确的真实接口.

问题是SSIS在一个关键点将一个对象传递给本机接口,我需要将它转换为我的包装器接口:

#if SQL2005
public void Initialize(IDTSComponentMetaData90 c,IServiceProvider s) {
#elif SQL2008
public void Initialize(IDTSComopnentMetaData100 c,IServiceProvider s) {
#endif
  m_ComponentMetaData = (IDTSComponentMetaData) c;
  m_ServiceProvider = s;
}
Run Code Online (Sandbox Code Playgroud)

这没有问题编译,但在运行时,我得到一个'无法将类型'System .__ ComObject'的COM对象转换为接口类型'MyNameSpace.IDTSComponentMetaData'.此操作失败,因为对IID为"{483E01E7-001C-35E4-Ac9f-4B0C1B81E409}"的接口的COM组件的QueryInterface调用由于以下错误而失败:不支持此类接口(HRESULT异常:0x80004002(E_NOINTERFACE)) .

我做的完全错了吗?

dtb*_*dtb 5

你不是简单地根据SQL Server版本对接口进行别名的原因吗?

#if SQL2005
using IDTSComponentMetaData = IDTSComponentMetaData90;
#elif SQL2008
using IDTSComponentMetaData = IDTSComopnentMetaData100;
#endif
Run Code Online (Sandbox Code Playgroud)