是否可以迭代List <dynamic>?</dynamic>

时间:2013-08-11 16:58:07

标签: c# dynamic

在过去的几天里,我一直试图找到一种方法来迭代List<dynamic>但没有取得多大成功。

这就是我正在做的事情:

while (dr.Read())
{
    dynamic e = new ExpandoObject();
    var d = e as IDictionary<string, object>;
    for (var i = 0; i < dr.FieldCount; i++)
        d.Add(dr.GetName(i), DBNull.Value.Equals(dr[i]) ? null : dr[i]);

    result.Add(e);
}

上面的代码是一个返回IEnumerable<dynamic>的方法,然后在我的控制器中我收到数据:

dynamic irionErrorsExport = oracleDbManager.GetStrCtrlNDGWithErrors(tableName, queryParamsList, periodo, "", "", "");

现在我陷入困境,因为我需要迭代irionErrorsExport并创建一个与EPPlus一起使用的“具体”对象。

任何人都可以告诉我它是否可能并显示一个简单的例子?

3 个答案:

答案 0 :(得分:2)

是的,您可以遍历dynamic对象:

dynamic source = new List<int>() {1, 2, 3, 4, 5, 6};
foreach (var item in source)
{
    Console.Write(item.ToString());
}

123456打印到控制台。

但是,如果无法进行迭代,它将导致运行时异常:

请考虑以下代码:

dynamic source = 2;
foreach (var item in source)
{
    Console.Write(item.ToString());
}

RuntimeBinderException被抛出:

  

无法将类型'int'隐式转换为'System.Collections.IEnumerable'

修改 :您应该了解普通变量foreachdynamic之间的差异。他们在另一个SO问题中解释:C# 4.0 'dynamic' and foreach statement

答案 1 :(得分:1)

while (dr.Read())
{
    IDictionary<string, object> e = new ExpandoObject();

    for (var i = 0; i < dr.FieldCount; i++)
        e.Add(dr.GetName(i), DBNull.Value.Equals(dr[i]) ? null : dr[i]);

    result.Add(e);
}

从调用方法中你“欺骗”。您知道您的动态集合是ExpandoObject,所以

foreach (IDictionary<string, object> row in result)
{
    foreach (var kv in row)
    {
        Console.WriteLine("{0}: {1}", kv.Key, kv.Value);
    }
}

最后,如果您的方法只返回List<IDictionary<string, object>>,而不是dynamic,则效果会更好。

对动态类型的反思很难。除非你可以使用鸭子打字(鸭子打字就是当你知道对象可以Duck()时,即使你不知道它究竟是什么,所以你可以做dynamic x = something; x.Duck();),那么它只是半硬。如果您不相信我,可以尝试阅读How do I reflect over the members of dynamic object?

答案 2 :(得分:1)

如果您填写DataTable here之类的//Sample DataTable DataTable dt = new DataTable(); dt.Columns.Add("IntCol"); dt.Columns.Add("StrCol"); dt.Rows.Add(new object[]{1,"1"}); dt.Rows.Add(new object[]{2,"2"}); var jsonstr = JsonConvert.SerializeObject(dt); var list = JsonConvert.DeserializeObject<List<YourClass>>(jsonstr); public class YourClass { public int IntCol { set; get; } public string StrCol { set; get; } } ,则可以使用Json.Net轻松获取具体对象

{{1}}