【问题标题】:C# extend indexer?C#扩展索引器?
【发布时间】:2011-11-09 07:32:11
【问题描述】:

是否可以使用扩展方法来扩展索引器?我希望能够使用这样的标题文本从给定DataGridViewRowDataGridViewCell 中获取单元格的值:

object o = row["HeaderText"]; 

我有这个代码

public static class Ext
{
    public static object Cells(this DataGridViewRow r, string header)
    {
        foreach (DataGridViewCell c in r.Cells)
        {
            if (c.OwningColumn.HeaderText == header)
            {
                return c.Value;
            }
        }
        return null;
    }
}

我想要类似的索引器。谢谢。

【问题讨论】:

    标签: c# datagridview indexer


    【解决方案1】:

    不,您不能使用扩展方法扩展运算符,例如索引器。

    【讨论】:

    • 是索引器在 C# 中的操作符!
    【解决方案2】:

    很遗憾,没有。这实际上是一个不受支持的“扩展属性”。您必须将其作为一种方法,就像您当前的代码一样。

    请注意,在 Connect on multiple occasions 上已请求扩展属性,但从未包含在语言中。

    【讨论】:

      【解决方案3】:

      索引器实际上是属性,C# 中不存在扩展属性。所以这不能按照你想要的方式完成。

      请参阅 this blog post 了解有关该主题的一些背景信息,以及为何考虑该功能但最终从 C# 3.0 中省略的解释。

      【讨论】:

        【解决方案4】:

        不,这是不可能的。扩展方法仅限于方法。它们不能提供属性、索引器或构造器

        【讨论】:

          【解决方案5】:

          不,不是。扩展方法只是静态方法调用的语法糖,索引器是一个属性。

          在做

          object o = new object();
          o.ExtensionMethod();
          

          等价于

          object o = new object();
          Extensions.ExtensionMethod(o);
          

          扩展方法不会以任何方式改变类,它们只是为您提供一个更简单的接口来调用静态方法。

          【讨论】:

            【解决方案6】:

            作为扩展属性的一种解决方法,您可以使用基于反射的对象索引器代码为对象实现 Getter 和 Setter 扩展方法。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2014-11-03
              • 2020-01-30
              • 2012-02-19
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2010-10-20
              • 1970-01-01
              相关资源
              最近更新 更多