【问题标题】:How to use indexers with Extension Methods having out parameter and function calls如何将索引器与具有参数和函数调用的扩展方法一起使用
【发布时间】:2011-03-08 05:41:38
【问题描述】:

是否可以将indexersextension 方法一起使用。

例如。仅将其视为示例。

    public static object SelectedValue(this DataGridView dgv, string ColumnName)
    {            
        return dgv.SelectedRows[0].Cells[ColumnName].Value;
    }

编辑

  1. 使用mygrid.SelectedValue("mycol")

  2. 如何将其用作索引器mygrid.SelectedValue["mycol"] 而不是上面一个。

  3. 也可以这样使用吗? mygrid.SelectedValue["mycol"](out somevalue);

获取这种值的语法是什么。任何简单的示例或链接都可以。

【问题讨论】:

    标签: c# .net extension-methods indexer


    【解决方案1】:

    嗯,这里有两个问题:

    • C# 不(大体上)支持命名索引器1
    • C# 不支持扩展属性,因此您不能将 SelectedValue 设为返回可索引内容的属性

    所以不,您在此处指定的语法将不起作用。你可以让它工作:

    mygrid.SelectedValue()["mycol"]
    

    但这有点难看。如果我是你,我会坚持使用方法形式。


    1 C# 4 支持在 COM 对象上调用命名索引器。

    【讨论】:

    • @Jon: 在这种情况下我需要在这里创建什么样的索引器。 msdn.microsoft.com/en-us/library/6x16t2tx.aspx。我阅读此链接以创建索引器,但它将如何在扩展类中工作。是否可以在静态类中使用它,因为我需要创建索引器也是静态的
    • 我也更喜欢上面在我的问题中指定的方法,除非我已经命名了我必须开始使用 C# 4 的索引器
    • 为什么只支持 COM 上的命名索引器?
    • @Jon:如何在 2K8 中将命名索引器用于数据表和数据集等等。即(new DataTable).Rows[0]["mycol"]。 .net 不会向以前版本本身中的每个人打开此索引器
    • @Shantanu:那是使用Rows 属性,它返回一个DataRowCollection,它本身有一个索引器。请参阅我的第二个要点 - 您无法创建扩展属性。
    【解决方案2】:

    让我试着澄清一下Extension Method的用法和意图。

    考虑Extension Method

    public static bool IsNullOrEmpty(this string source)
    {
        return source == null || source == string.Empty;
    }
    

    现在你用这个Extension Method扩展你的string

    var myString = "Hello World";
    Assert.AreEqual(myString.IsNullOrEmpty(), false);
    

    这是 .NET 在编译时所做的:

    public static bool IsNullOrEmpty(string source)
    {
        return source == null || source == string.Empty;
    }
    

    使用我们的老学校

    var myString = "Hello World";
    Assert.AreEqual(IsNullOrEmpty(myString), false);
    

    扩展方法只不过是对我们过去所做的事情的可视化。

    嗯,扩展索引器是可能的,但微软没有考虑过。

    【讨论】:

      猜你喜欢
      • 2017-02-08
      • 1970-01-01
      • 2018-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-16
      • 2014-06-08
      相关资源
      最近更新 更多