我是C#的新手,我想在最近的项目中使用匿名类型,但我遇到一个需要你帮助的混乱问题。 我首先使用对象[]但是我收到错误。代码如下所示:
List<object> f = new List<object>();
f.Add(new { Name = 1, Age = 31 });
f.Add(new { Name = 2, Age = 31 });
f.Add(new { Name = 3, Age = 4 });
f.Add(new { Name = 4, Age = 1 });
f.Add(new { Name = 5, Age = 1 });
var a = f[0].Age; // no use
但是这段代码很有用:
var f = new []
{
new { Name = 1, Age = 31 },
new { Name = 2, Age = 31 },
new { Name = 3, Age = 4 },
new { Name = 4, Age = 1 },
new { Name = 5, Age = 1 }
};
var a = f[0].Age;
我只想使用匿名类型的List并访问它的成员。 我的方法有什么问题,我应该怎样做才能达到目标?
答案 0 :(得分:5)
Object
没有Age
属性。因此,第一种方法不会编译,因为您已将匿名类型装箱为对象。
第二种方法有效,因为编译器知道它是哪种(匿名)类型。
您不能在当前方法之外使用匿名类型。因此,我建议使用具体类型。
class Person
{
public int Age{ get;set; }
public string Name{ get;set; }
}
现在使用:
var f = new List<Person>(){
new Person{ Name = "1", Age = 31 },
new Person{ Name = "2", Age = 31 },
new Person{ Name = "3", Age = 4 },
new Person{ Name = "4", Age = 1 },
new Person{ Name = "5", Age = 1 }
};
var a = f[0].Age;
答案 1 :(得分:2)
编辑 - 更新了答案。最初的答案是最终的。
以下无效
List<object> f = new List<object>();
因为对象没有Age
属性。
要获取Age属性,您需要将其类型转换为具体类型。但是由于你使用了匿名类型,你在编码时没有具体类型(因此你无法投射它)。
另一种(气馁的)替代方案是使用reflection
PropertyInfo[] properties = f[0].GetType().GetProperties();
var ageProperty = properties.First (x=> x.Name == "Age");
var a = ageProperty.GetValue (f[0],null); // no use
另一种替代方法(如果是.NET 4.0及更高版本)是使用关键字dynamic
。
dynamic obj = f[0];
int age = obj.Age;
Console.WriteLine(age); // prints 31
原始回答
更改
object[] f = new object[]
到
var f = new []
并且第一个将起作用。
答案 2 :(得分:0)
问题是因为你正在使用匿名类型(但也许这没关系,因为你首先尝试使用它们)你实际上无法声明或传递这个列表(你如何声明{ {1}}?)
您可以利用泛型类型推断和List<SomeAnonymousTypeThatDoesNotHaveAName>
来使用泛型和作弊:
var
当您再次呼叫public List<T> BuildList<T>(params T[] entries)
{
return new List<T>(entries);
}
时,因为它们是匿名类型,您无法明确指定BuildList
,但您可以让类型推断处理它!
<T>
类型推断可以很好地处理匿名类型并构建列表!
var list = BuildList(
new { Name = 1, Age = 31 },
new { Name = 2, Age = 31 },
new { Name = 3, Age = 4 },
new { Name = 4, Age = 1 },
new { Name = 5, Age = 1 });
编辑:更好的是制作扩展方法!
Console.WriteLine(list.Count); //5
Console.WriteLine(list[0].Name + ", " + list[0].Age); //1, 31
Console.WriteLine(list.GetType().FullName); //System.Collections.Generic.List`1[[<>f__AnonymousType0`2[[System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], query_jyattd, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null]]
然后你就可以使用它:
public static class ArrayExtensions
{
public static List<T> MakeAnonymousList<T>(this T[] entries)
{
return new List<T>(entries);
}
}
编辑:很酷的是你有一个功能齐全的var list = new[] {
new { Name = 1, Age = 31 },
new { Name = 2, Age = 31 },
new { Name = 3, Age = 4 },
new { Name = 4, Age = 1 },
new { Name = 5, Age = 1 }}
.MakeAnonymousList();
可以添加/删除/ Linq。添加项目必须使用相同的参数和顺序完成:
List<T>
Intellisense也很棒!