【问题标题】:How to obtain property name and types (by reflexion or better) of a linq result anonymous type如何获取 linq 结果匿名类型的属性名称和类型(通过反射或更好)
【发布时间】:2011-05-23 17:27:45
【问题描述】:

我需要获取 linq 结果的属性名称和类型(通过反射或更好)... 我说得更好,因为我认为 linq 应该在每个查询中都有一个包含此信息的结构!!!

例如

我有一个类似的 linq 查询:

dim query1 = from e0 in clients select new { e0.id, e0.name }

我将 query1 作为参数传递给函数,然后我需要知道 query1 中有多少属性、属性名称和属性类型...

谢谢,ZEE ;)

【问题讨论】:

    标签: linq properties introspection


    【解决方案1】:
    Type memberType = query1.GetType().GetGenericArguments()[0];
    foreach (var a in query1)
    {
        foreach (PropertyInfo pi in memberType.GetProperties())
        {
            Console.WriteLine(pi.GetValue(a, null));
        }
    }
    

    实际上,我会将PropertyInfos 存储在List<PropertyInfo> 中,并在内部foreach 中使用存储的属性。但是上面的代码是最容易理解的。

    【讨论】:

    • 嗨 Alireza...这不起作用...内部循环永远不会执行。有什么建议吗?
    • var q0 = from e0 in a0 select new { id = e0, nome = "Client#"+e0, data = e0 * e0 , flag = e0 % 2 }; // 'q0.Dump();类型 memberType = q0.GetType().GetGenericArguments()[0]; foreach (var a in q0) { Console.WriteLine("执行成功!"); foreach (propertyInfo pi in memberType.GetProperties()) { Console.WriteLine("这不会执行!"); Console.WriteLine(pi.GetValue(a, null)); } }
    【解决方案2】:

    首先,您不应该将类型为匿名类型实例序列的查询结果传递给另一个方法。如果你这样做,你应该为查询结果创建一个具体的类。

    您可以使用反射从query1 中撕下属性,如下所示。 query1 将为某些独特的类型 T 实现 IEnumerable<T>。一旦你有了这个类型,你就可以调用

    type.GetProperties()
    

    获取匿名类型成员名称的枚举。

    【讨论】:

    • 对不起,伙计,我已经去过那里......我真的需要将匿名类型作为计算传递给另一个函数(微软说只能在程序集之间完成,所以在同一个组件中没有问题),无论如何谢谢...... ZEE
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-12
    • 2011-01-26
    • 2011-06-04
    • 2017-04-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多