首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何向COM公开“泛型”C#集合

如何向COM公开“泛型”C#集合
EN

Stack Overflow用户
提问于 2022-04-26 12:10:11
回答 1查看 88关注 0票数 3

我有一个API,我开发了一个C#客户端,它将HTTP请求转换为C#对象。

我已经使客户端COM可见,因为我在VB6中需要它,这里的问题是泛型集合不能在COM上工作。我已经为此做了一个“修复”,我自己实现了一个集合,但它不是泛型的。

这意味着我的每个类都有一个名为Class_Collection的类,这意味着我有一个没有泛型类的集合。

这很好,除非我们的API非常大,有很多不同的对象,所以如果我不必为API中的每个类编写实现,那就太好了。

我一直在体验可以继承的泛型基类或泛型接口,但正如前面所述,COM不喜欢泛型类。我还需要一个IDispatch接口来公开功能,以便在VB6中公开类函数。

是否有一种方法可以为我的所有集合编写实现,并在任何需要的地方继承该功能?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-04-26 21:15:49

泛型确实与COM不兼容,据我所知,这种限制本身是无法避免的。

作为一种简单的解决方法,我使用的方法是专门为COM-互操作添加包装器属性。

示例:

代码语言:javascript
复制
[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#端的其他地方使用。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72013699

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档