C# 怎么可能在不知道匿名类型字段的情况下使用它们?

C# 怎么可能在不知道匿名类型字段的情况下使用它们?,c#,.net,anonymous-types,C#,.net,Anonymous Types,GridView的DataSource属性如何获得匿名类型并在网格中显示结果对我来说真的很酷 简单地 Grid.DataSource = from order in db.OrdersSet select new { order.PersonSet.Name,order.PersonSet.SurName}; 例如,如何编写一个属性或方法,该属性或方法接受匿名类型并将字段值写入控制台输出?匿名类型在某种程度上是语法糖。编译器分析这些操作的输出,并使用您请求的属性动态创建类。它只需

GridView的DataSource属性如何获得匿名类型并在网格中显示结果对我来说真的很酷

简单地

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

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

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

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

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

var anonymousType = new { Name = "chibacity", Age = 21 };
此机制由编译器自动执行,但使用类似于您可以反汇编已编译代码的工具,您将看到已生成一个类来表示此匿名类型,例如:

[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; }
}
[编译生成]

[DebuggerDisplay(@“{Name={Name},Age={Age}}”,Type=“

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

var anonymousType = new { Name = "chibacity", Age = 21 };
此机制由编译器自动执行,但使用类似于您可以反汇编已编译代码的工具,您将看到已生成一个类来表示此匿名类型,例如:

[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; }
}
[编译生成]

[DebuggerDisplay(@“{Name={Name},Age={Age}”),Type=“

您可以这样做:

    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)));

        }
    }

您可以这样做:

    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)));

        }
    }
带着沉思

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

带有反射


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

这不是我问题的答案,但这是因为您编辑了answer在@Femaref发布之后。通常在SO上添加“编辑”我也回答了你的问题。老实说,我认为我的问题很清楚,但我看到答案是解释匿名类型,所以我试图让我的问题更清楚。如果我改变问题的方式,我会使用edit。这不是我问题的答案,但那是因为你editd在@Femaref发布后给出您的答案。通常在SO上添加“已编辑”我也在你编辑时回答了你的问题。老实说,我认为我的问题很清楚,但我看到答案是解释匿名类型的,所以我试图让我的问题更清楚。如果我以非常不同的方式更改问题,我会使用editDuplicate:Duplicate: