【问题标题】:DefaultMemberAttribute - what does it do?DefaultMemberAttribute - 它有什么作用?
【发布时间】:2010-11-10 07:50:59
【问题描述】:

我已经阅读了有关它的 MSDN 文章。在内部,它似乎是 c# 设置哪个函数将作为索引器工作的方式(对吗?)。现在,我看到了以下示例:

[DefaultMemberAttribute("Main")]
public class Program {

    public static void Main() {
        ...
    }
}

现在,我不明白这是什么意思。


谢谢大家。但是除了索引器之外,我仍然无法获得它的用处。我们什么时候调用 InvokeMember?

【问题讨论】:

标签: c# .net vb.net attributes


【解决方案1】:

不,DefaultMemberAttribute 被诸如 VB.NET 之类的语言用来找出在没有从对象引用任何成员时默认作用的成员,即由 InvokeMember 调用的成员。正如您所指出的,这通常与索引器一起使用,但 C# 不直接使用它(除非您明确使用 InvokeMember)。

但是,为了其他 .NET 语言的利益,C# 确实为类的索引器(如果有的话)发出 DefaultMemberAttribute,如 MSDN 所示:

C# 编译器发出 任何类型的 DefaultMemberAttribute 包含一个索引器。在 C# 中,它是一个 手动属性类型的错误 使用 DefaultMemberAttribute 如果 type 还声明了一个索引器。

我认为 MSDN 在评论中大量提及索引器,但随后给出了一个不使用索引器的示例,从而使事情变得混乱。澄清一下,默认成员可以是任何东西,但 C# 通过为您(如果存在索引器)发出属性来为索引器提供特殊行为,但所有其他用例除外。

【讨论】:

    【解决方案2】:

    我个人从未使用过它,但据我所知,您正在定义调用InvokeMember 时要调用的默认方法。所以,如果我要说的话,使用你提供的代码 sn-p:

    Program prog = new Program();
    typeof(Program).InvokeMember("", null, null, prog, null);
    

    因为我将 InvokeMember 调用的第一个参数留空,它将使用该属性来确定您的类的默认成员是什么,在您的情况下它是 Main。

    【讨论】:

      【解决方案3】:

      DefaultMemberAttribute 属性定义了在使用空字符串作为第一个参数调用 InvokeMember 时要调用的默认成员。

      如果您阅读 InvokeMember 的 MSDN 文档,它会明确表示:

      参数
      名称
      类型:System.String
      包含要调用的构造函数、方法、属性或字段成员的名称的字符串。
      - 或 -
      用于调用默认成员的空字符串 ("")。

      默认成员将是由 DefaultMemberAttribute 属性声明的成员。

      【讨论】:

        猜你喜欢
        • 2011-01-14
        • 1970-01-01
        • 2019-04-26
        • 2016-04-29
        • 2017-03-02
        • 2012-10-04
        • 1970-01-01
        • 2014-05-03
        • 2018-09-20
        相关资源
        最近更新 更多