1

私は C# の初心者で、最近のプロジェクトで匿名型を使用したいのですが、混乱の問題に直面しており、あなたの助けが必要です。最初は object[] を使用していますが、エラーが発生します。コードを以下に示します。

        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

しかし、このコードは便利です:</p>

    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; 

匿名型のリストを使用して、そのメンバーにアクセスしたいだけです。私の方法のどこが間違っていて、目標を達成するために何をすべきか?

4

3 に答える 3

5

AnにはプロパティObjectがありません。Ageしたがって、匿名型をオブジェクトとしてボックス化したため、最初のアプローチはコンパイルされません。

2 番目の方法は、コンパイラがそれがどの (匿名) 型であるかを認識しているためです。

現在のメソッドの外で匿名型を使用することはできません。したがって、具象型を使用することをお勧めします。

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;
于 2012-12-29T11:34:50.327 に答える
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 以降の場合) は、 keyword を使用することdynamicです。

   dynamic obj = f[0];
   int age = obj.Age;
   Console.WriteLine(age); // prints 31

元の答え

変化する

object[] f = new object[]

 var f = new []

最初のものは機能します。

于 2012-12-29T11:34:25.760 に答える
0

問題は、匿名型を使用しているためです (ただし、最初にそれらを使用しようとしているので、これで問題ない可能性があります)。このリストを実際に宣言したり渡したりすることはできません (どのように宣言し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();

編集: クールなことは、List<T>Linq を追加/削除/削除できる完全に機能することです。項目の追加は、同じパラメーターと順序で行う必要があります。

list.Add(new { Name = 6, Age = 2 }); //OK
list.Add(new { Age = 2, Name = 6 }); //compile error!


var maxAge = list.Max(person => person.Age);
var oldPerson = list.Where(person => person.Age == maxAge).First();
Console.WriteLine(maxAge); //31
Console.WriteLine(oldPerson.Name + ", " + oldPerson.Age); //1, 31

インテリセンスも大活躍!

于 2012-12-29T12:19:12.290 に答える