从c#创建一个COM索引属性
本文关键字:一个 COM 索引 属性 创建 | 更新日期: 2023-09-27 17:55:02
我试图模仿一个新的。net一个旧的vb6 dll。模仿必须是完美的,以便调用者不知道他们正在使用新的。dll。
我有一种好奇心。在VB6中,它在对象库中有以下内容:
Property BankList(Index As Long) As String
但是AFAIK属性不能在。net中完成?
我能得到的最接近的是创建一个显示该行为的函数,但然后COM类型从属性到方法。
谁能建议我如何用属性创建签名?
您可以使用IndexerNameAttribute
属性来装饰常规索引器,以便将其名称公开给其他语言。不过,我不确定这是否能达到你的目标。
不幸的是,c#只支持调用命名索引器作为COM互操作的一部分,没有支持的语言方式来实现你自己的(即,一个类只能有默认的索引器与IndexerNameAttribute
属性)。
你可以为c#调用者创建一些类似的东西,通过实现带有索引器的类型,然后拥有该类型的属性,但它不能完全映射到你需要的VB6等效。
参见:Using Indexers (c#)
除了
正如在其他答案中提到的那样,虽然c#不支持命名索引器,但。net CLR和其他一些语言,如VB。网,做。为了获得此功能,您可能需要考虑更改目标语言。
根据http://blogs.msdn.com/b/kirillosenkov/archive/2009/10/20/indexed-properties-in-c-4-0.aspx,你不能在c#中声明索引属性。然而,与其他一些答案的状态相反,CLR 确实支持它们,并且您可以在VB.NET中声明它们。
命名参数化属性不能在c#中创建(只有一个默认的,称为this
可用)。
有多个选项:
- 更改接口(但这忽略了重点,因为客户端代码需要更改)。
- 使用VB (.net),它可以创建这些属性。
- 在c++中创建一个适配器,以在COM级别提供完全的控制。
第一种方法意味着改变接口,而这违背了您的要求。最后一个选项提供了最大的控制,但要复杂得多(除非您已经了解c++ COM开发)。我会选择VB.NET
索引属性在。net/c#中是可用的,但是你不能命名它们:
public String this[long index]
{
get; set;
}
这将创建一个名为Item
的属性,但在c#中不使用此名称:
myObj[1L];
如果你想在c# 4.0中调用COM中的命名属性,你可以:
excel.Range["a"];
http://blogs.msdn.com/b/kirillosenkov/archive/2009/10/20/indexed -属性- c - 4 - 0. - aspx
最后,如果您希望以COM语言命名索引,您可以使用IndexerNameAttribute将索引器作为命名属性公开。