【问题标题】:Extension Method for anonymous type匿名类型的扩展方法
【发布时间】:2014-11-26 11:54:32
【问题描述】:

我有一个DataTable,我想更新它的记录。我想更新多列的记录,我想为此编写扩展方法。我不确定它将接受什么参数以及返回什么参数。我的代码

public static class ExtensionClass
{
    public static IEnumerable<object> UpdateColumns(this IEnumerable<object> e, List<string> columns, List<object> values)
    {
        int index = 0;
        var rec = e.First();
        foreach (string col in columns)
        {

        }
    }
}

我在rec 上没有得到像SetField() 这样的东西。我错过了什么?

【问题讨论】:

  • 好吧,rec 的类型是 object... 而 object 没有 SetField 方法 - 目前尚不清楚您为什么期望它。此外,匿名类型无论如何都是不可变的......
  • rec 的类型为 object,因此您只能访问 object 的成员。目前尚不清楚为什么要为IEnumerable&lt;object&gt; 编写扩展方法,如果您希望它用于DataTable,我要做的第一件事是将您的第一个参数更改为this DataTable table
  • 我只是在玩扩展方法,它不是真正的任务:)。

标签: c# datatable extension-methods


【解决方案1】:

显然,在这种情况下,rec 是对象类型,因此它没有 SetField() 方法。您应该声明 IEnumerable 的类型。 你看过: http://msdn.microsoft.com/en-us/library/bb336477%28v=vs.110%29.aspx

【讨论】:

    【解决方案2】:

    我有一个 DataTable,我想更新它...

    所以,你想为你的 dataTable 写一个扩展方法。

    我想更新多列的记录...

    我认为您想将 dataTable 的所有行的列值更新为特定值。我可以建议你使用IDictionary&lt;string, TValue&gt;而不是像List&lt;string&gt; columns, List&lt;object&gt; values这样的单独列表,那么扩展方法可以是这样的:

    public static void UpdateColumns<TValue>(this DataTable dataTable,
        IDictionary<string, TValue> columnValuePair)
    {
        foreach (DataRow dataRow in dataTable.Rows)
        {
            foreach (var pair in columnValuePair)
            {
                dataRow[pair.Key] = pair.Value;
            }
        }
    }
    

    然后这样称呼它:

    var columnValuePair = new Dictionary<string, string>
    {
        {"ColumnName1", "newValue1" },
        {"ColumnName2", "newValue2" }
    };
    
    yourDataTable.UpdateColumns(columnValuePair);
    

    请注意,您不需要将DataTable 作为此扩展方法的结果返回,并将其设置为yourDataTable

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-02
      • 1970-01-01
      • 2017-08-15
      • 1970-01-01
      相关资源
      最近更新 更多