带参数的属性

9

我在VB.NET中遇到了一些奇怪的问题,以前从未遇到过...

我有一个类在VB.NET中,其中包含一个带参数的属性,并且我想通过创建VB.NET类的对象在其他C#类中使用该属性,但是类对象并没有显示该属性,有人能告诉我是否可以访问该属性吗?

  • 如果可以,应该如何访问?
  • 如果不行,CLR是什么意思?

这是我的代码...

Public Property AsString(ByVal name As String) As String
    Get
            //Some code
    End Get
    Set(ByVal value As String)
            //Some code
    End Set
End Property

注意: 我无法更改VB.NET代码,因为它是编译的DLL文件。

提前致谢。


属性带参数是什么意思? - Sleiman Jneidi
1
你为什么提到 CLR - Tim Schmelter
我知道这已经是4年后的事了,但直到现在我才需要这样做。那么C#仍然不支持具有参数的属性吗?我在VB中看到过,但从未在C#中看到过。我认为答案是肯定的,C#不支持这个。我只是想验证一下。 - Rod
@Rod 是的,C# 不支持那个,除了一个通过 this 实现为索引器的单个默认属性。请参见这里 - ErikE
3个回答

10

参数化属性被转换为get_set_方法。

string name = "Foo";
string value = "Bar";
MyObject.set_AsString(name, value);
string fooValue = MyObject.get_AsString(name);

6

C#不支持没有默认关键字的索引属性。您只需要使用 get_AsString() 调用属性 getter并使用 set_AsString()调用setter。这是方法而不是属性,它们应该出现在 IntelliSense 列表中。

还要注意,即使您将属性 setter 设为非索引,set_AsString() 也需要两个参数。传递任何内容,null 就可以了。

顺便说一下,这或许说明了 C# 团队为什么决定不在一般情况下支持索引属性。获取器和设置器之间的不匹配很痛苦。VB.NET 团队别无选择,因为 Visual Basic 在 .NET 问世之前就有它们了。不过,它在 C# 版本 4 中重新出现了,索引属性在 COM 接口上得到了支持。没有它们,COM 互操作编程太痛苦了。特别是在 Office 对象模型中。


你在谈论什么“不匹配”?属性设置器是索引的;设置器的“参数列表”只包括值,因为它是在属性定义本身中未指定的唯一内容。如果一个索引和非索引属性具有相同的名称,并且非索引属性的类型具有默认索引器,则可能会出现轻微的歧义,但实际上并不存在歧义:如果存在合适的索引属性,则thing.prop(x)将绑定到该属性;如果想使用非索引属性并索引结果,则可以使用(thing.prop)(x) - supercat
如果有一个字典,可以按照添加的顺序保存键和值,并允许通过数值索引来访问键或值,并且还允许通过键来访问值,那么这样的东西可能会很有用。MyDict.Keys(2) 是第三个添加的键,MyDict.Values(2) 是它对应的值。通过使MyDict.KeysMyDict.Values 分别返回一个结构体,该结构体持有对字典的引用,并具有一个索引器,该索引器将在该字典上调用合适的函数,也可以实现类似的结果,但是那种方式会更加繁琐。 - supercat
如果他们像在C++/CLI中那样执行,并强制getter和setter必须定义并使用相同的参数,那么就不应该有任何混淆:public string Source[int i_ixSource] { get (int i_ixSource) {...} set (int i_ixSource) {...} }。目前,对我来说,绕过我在C++/CLI代码中实现的数十个好的参数化属性并转换为C#是一件非常麻烦的事情。 - Tobias Knauss

0

如果您注意到,实际上您的属性中有两个参数,一个是您的名称,另一个是默认值,因此在使用它时,您必须提供两个参数值


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接