【问题标题】:Property with parameter带参数的属性
【发布时间】:2011-12-21 22:59:01
【问题描述】:

我在 VB.NET 中发现了一些奇怪的东西,以前从未注意到...

我在 VB.NET 中有一个具有 带参数的属性 的类,我想在其他 C# 中使用该属性类通过制作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。

提前致谢

【问题讨论】:

  • 带参数的属性是什么意思?
  • 为什么提到CLR
  • 我知道这是 4 年后的事了,但直到现在我才不得不这样做。那么 C# 仍然不支持有参数的属性吗?我在 VB 中见过它,但从未在 C# 中见过它。我想答案是肯定的,C# 不支持。我只是想验证一下。
  • @Rod 是的,C# 不支持,除了通过this 实现为索引器的单个默认属性。见this

标签: c# vb.net properties


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    还要注意 set_AsString() 需要 两个 参数,即使您将属性设置器设为非索引也是如此。传递任何东西,null 都可以。

    Fwiw,这也许说明了为什么 C# 团队决定在一般情况下不支持索引属性。 getter 和 setter 之间的不匹配是痛苦的。 vb.net 团队别无选择,Visual Basic 早在 .NET 出现之前就有了它们。虽然它确实在 C# 版本 4 中部分卷土重来,但 COM 接口支持索引属性。没有它们,COM 互操作编程太痛苦了。特别是在 Office 对象模型中。

    【讨论】:

    • 你在说什么“不匹配”?属性设置器被索引; setter 的“参数列表”仅包含该值,因为它是唯一未在属性定义本身中指定的内容。如果索引属性和非索引属性具有相同的名称,并且非索引属性的类型具有默认索引器,则可能会有轻微的明显歧义,但实际上没有歧义:thing.prop(x) 将绑定到合适的索引属性(如果存在);如果想使用非索引的索引并索引结果,可以使用(thing.prop)(x)
    • 这样的东西可能很有用,如果一个人有例如一个字典,它按添加顺序保存键和值,除了允许通过键访问值外,还允许通过数字索引访问键或值。 MyDict.Keys(2) 将是添加的第三个键,MyDict.Values(2) 将是其对应的值。通过让MyDict.KeysMyDict.Values 各自返回一个包含对字典的引用的结构,并有一个索引器可以调用该字典上的合适函数,可以实现类似的结果,但这会更麻烦。
    • 如果他们像在 C++/CLI 中那样做,并强制 getter 和 setter 必须定义和使用相同的参数,那么就不应该有任何混淆:public string Source[int i_ixSource] { get (int i_ixSource) {...} set (int i_ixSource) {...} } 目前这是一个很大的痛苦在转换为 C# 时,我在 C++/CLI 代码中实现了几十个不错的参数化属性。
    【解决方案3】:

    如果你注意到你的属性中有两个参数,一个是你的名字,另一个是默认值,所以当你使用它时你必须给出两个参数值

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-05-17
      • 2018-07-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多