我有一个API,我开发了一个C#客户端,它将HTTP请求转换为C#对象。
我已经使客户端COM可见,因为我在VB6中需要它,这里的问题是泛型集合不能在COM上工作。我已经为此做了一个“修复”,我自己实现了一个集合,但它不是泛型的。
这意味着我的每个类都有一个名为Class_Collection的类,这意味着我有一个没有泛型类的集合。
这很好,除非我们的API非常大,有很多不同的对象,所以如果我不必为API中的每个类编写实现,那就太好了。
我一直在体验可以继承的泛型基类或泛型接口,但正如前面所述,COM不喜欢泛型类。我还需要一个IDispatch接口来公开功能,以便在VB6中公开类函数。
是否有一种方法可以为我的所有集合编写实现,并在任何需要的地方继承该功能?
发布于 2022-04-26 21:15:49
泛型确实与COM不兼容,据我所知,这种限制本身是无法避免的。
作为一种简单的解决方法,我使用的方法是专门为COM-互操作添加包装器属性。
示例:
[ComVisible(false)]
public List<int> SomeNumbers {get; set;}
[ComVisible(true)]
[Obsolete("Use this for COM interop only")]
public IList SomeNumbersCOM => SomeNumbers;这样做的好处是非常简单,不实际复制任何数据,并通过COM进行功能。但是,它显然不是类型类型,因为在VB6中,SomeNumbersCOM的条目看起来只是object。但无论如何,VB6并不是一个特别重要的类型,所以这可能不是什么大问题。并且至少可以在C#中使用真正的强类型集合。Obsolete帮助实现了这一点。
在我的经验中,类型安全的轻微损失并不是一个真正的问题。您仍然可以在VB端断言正确的类型;例如,在从Long列表中获取值时使用一个SomeNumbersCOM变量。
您不需要添加太多的代码,而不仅仅是样板代码。例如,您不必实际编写集合类代码或复制它们的内部逻辑。
您可以创建一个完整的包装类,而不是将属性包装在同一个类中,这样对于C#使用者来说就更干净了。
创建一个完全独立的COM可见包装程序集(它包含所有这些包装类)将是一种更强大的方法,可以强制要求包装器不能从C#端的其他地方使用。
https://stackoverflow.com/questions/72013699
复制相似问题