我试图用一个新的.net来模仿一个旧的vb6 dll。模仿必须是完美的,以便呼叫者不知道他们正在使用新的.dll。
但我很好奇。在VB6中,它在对象库中具有以下内容:
Property BankList(Index As Long) As String
但AFAIK属性不能在.net中完成吗?
我能得到的最接近的是创建一个展示该行为的函数,然后COM类型从Property转到Method。
有人可以建议我如何使用属性创建该签名吗?
答案 0 :(得分:4)
您可以使用indexer属性来装饰常规IndexerNameAttribute
,以便将其名称公开给其他语言。不过,我不确定这是否会实现你的目标。
不幸的是,C#只支持调用命名索引器作为COM互操作的一部分,没有支持的语言实现方式(即,一个类只能default indexer IndexerNameAttribute
属性)。
您可以通过实现带有索引器的类型然后具有该类型的属性来创建与C#调用者类似的内容,但它不会精确映射到您需要的VB6等效项。
另请参阅:Using Indexers (C#)
<强>除了强>
正如其他答案中所提到的,虽然C#不支持命名索引器,但.NET CLR和其他一些语言(如VB.NET)也可以。您可能需要考虑更改目标语言才能获得此功能。
答案 1 :(得分:2)
根据http://blogs.msdn.com/b/kirillosenkov/archive/2009/10/20/indexed-properties-in-c-4-0.aspx,您无法在C#中声明索引属性。但是,与其他一些答案所述的情况相反,CLR 支持它们,您可以在VB.NET中声明它们。
答案 2 :(得分:2)
无法在C#中创建命名的参数化属性(只有一个默认值,名为this
可用)。
有很多选择:
第一个意味着更改界面,这会破坏您的要求。最后一个选项提供了最多的控制权,但是要复杂得多(除非你已经知道C ++ COM开发)。我会选择VB.NET。
答案 3 :(得分:1)
.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-properties-in-c-4-0.aspx
最后,如果要为COM语言命名索引,可以使用IndexerNameAttribute将索引器公开为命名属性。