4

在过去的几天里,我一直在尝试找到一种方法来迭代 a 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>在我的控制器中返回一个 then 我正在获取数据:

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

现在我被困住了,因为我需要迭代 irionErrorsExport 并创建一个“具体”对象以与 EPPlus 一起使用。

谁能告诉我这是否可能并举一个简单的例子?

4

3 回答 3

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”

编辑:您应该注意foreach普通变量dynamic. 它们在另一个 SO 问题中进行了解释: C# 4.0 'dynamic' and foreach statement

于 2013-08-11T17:23:26.400 回答
1

如果你在这里DataTable填写一个like ,你可以使用Json.Net并轻松获得一个具体的对象

//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; }
}
于 2013-08-11T17:22:30.030 回答
0
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);
    }
}

最后,如果您的方法只返回 a 会更好List<IDictionary<string, object>>,没有dynamic必要。

对动态类型的反思很难。除非你可以使用鸭式打字(鸭式打字是当你知道对象可以Duck(),即使你不知道它到底是什么,所以你可以做dynamic x = something; x.Duck();),那么它只是半困难的。如果您对此不信任,可以尝试阅读如何反映动态对象的成员?

于 2013-08-11T17:19:18.443 回答