怎么可以在不知道的情况下使用匿名类型字段?

时间:2010-06-13 14:47:53

标签: c# .net anonymous-types

对我来说,看起来GridView的DataSource属性如何获取匿名类型并在Grid中显示结果真的很酷。

简单地

Grid.DataSource = from order in db.OrdersSet
       select new { order.PersonSet.Name,order.PersonSet.SurName};

例如,我如何编写一个带有匿名类型并将字段值写入控制台输出的属性或方法?

4 个答案:

答案 0 :(得分:2)

编译器在遇到使用匿名类型的语法时实际创建(自动生成)类,例如

var anonymousType = new { Name = "chibacity", Age = 21 };

这种机制由编译器自动化,但是使用像Reflector这样的工具,您可以反汇编编译的代码,您将看到已经生成了一个类来表示这种匿名类型,例如:

[CompilerGenerated]
[DebuggerDisplay(@"\{ Name = {Name}, Age = {Age} }", Type="<Anonymous Type>")]
internal sealed class <>f__AnonymousType0<<Name>j__TPar, <Age>j__TPar>
{
    // Fields
    [DebuggerBrowsable(DebuggerBrowsableState.Never)]
    private readonly <Age>j__TPar <Age>i__Field;
    [DebuggerBrowsable(DebuggerBrowsableState.Never)]
    private readonly <Name>j__TPar <Name>i__Field;

    // Methods
    [DebuggerHidden]
    public <>f__AnonymousType0(<Name>j__TPar Name, <Age>j__TPar Age);
    [DebuggerHidden]
    public override bool Equals(object value);
    [DebuggerHidden]
    public override int GetHashCode();
    [DebuggerHidden]
    public override string ToString();

    // Properties
    public <Age>j__TPar Age { get; }
    public <Name>j__TPar Name { get; }
}

<强>更新

现在你已经编辑了你的问题......

我假设您的问题是您希望访问声明范围之外的匿名类型。这个问题与以下内容重复:

访问C#匿名类型对象

Accessing C# Anonymous Type Objects

答案 1 :(得分:1)

匿名类型在某种程度上是语法糖。编译器分析此类操作的输出,并使用您请求的属性动态创建类。它只需要您的工作 - 在匿名类型之前,您必须为您使用的每种类型编写类或结构,即使它们只是临时信息。使用匿名类/方法/ lambdas,您不必再执行此操作并节省大量时间。

答案 2 :(得分:1)

您可以这样做:

    private void button2_Click(object sender, EventArgs e)
    {
        var p = new { a = 10, b = 20 };

        TestMethod(p);
    }

    private void TestMethod(object p)
    {
        Type t = p.GetType();

        foreach (PropertyInfo pi in t.GetProperties())
        {
            System.Diagnostics.Debug.WriteLine(string.Format("{0} = {1}", pi.Name, 
                t.InvokeMember(pi.Name, BindingFlags.GetProperty, null, p, null)));

        }
    }

答案 3 :(得分:1)

反思......

如果您有匿名类型的实例,则可以将其保存在object类型的变量中,在其上调用GetType(),然后GetFieldsGetProperties等,以找出与之关联的列。您看到的每个PropertyInfoFieldInfo都可以从该类型的任何实例中检索值。