object [] = object [] f = new object []和var f = new []之间的区别?

时间:2012-12-29 11:30:37

标签: c# anonymous-types

我是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并访问它的成员。 我的方法有什么问题,我应该怎样做才能达到目标?

3 个答案:

答案 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也很棒!