C# 怎么可能在不知道匿名类型字段的情况下使用它们?
GridView的DataSource属性如何获得匿名类型并在网格中显示结果对我来说真的很酷 简单地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}; 例如,如何编写一个属性或方法,该属性或方法接受匿名类型并将字段值写入控制台输出?匿名类型在某种程度上是语法糖。编译器分析这些操作的输出,并使用您请求的属性动态创建类。它只需
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: