[c#] C#で匿名型を返す


Answers

あなたは匿名型のランタイムチェック版を提供するdynamicを返すことができますが、.NET 4+

Question

私は匿名型を返すクエリを持っており、クエリはメソッド内にあります。 どのようにこれを書いていますか:

public "TheAnonymousType" TheMethod(SomeParameter)
{
  using (MyDC TheDC = new MyDC())
  {
     var TheQueryFromDB = (....
                           select new { SomeVariable = ....,
                                        AnotherVariable = ....}
                           ).ToList();

      return "TheAnonymousType";
    }
}



動的キーワードのみを使用できますが、

   dynamic obj = GetAnonymousType();

   Console.WriteLine(obj.Name);
   Console.WriteLine(obj.LastName);
   Console.WriteLine(obj.Age); 


   public static dynamic GetAnonymousType()
   {
       return new { Name = "John", LastName = "Smith", Age=42};
   }

しかし、ダイナミックなタイプのキーワードを使用すると、コンパイル時の安全性、IDE IntelliSenseなどが緩和されます...




この場合、オブジェクトのリストを返すことができます。

public List<object> TheMethod(SomeParameter)
{
  using (MyDC TheDC = new MyDC())
  {
     var TheQueryFromDB = (....
                           select new { SomeVariable = ....,
                                        AnotherVariable = ....}
                           ).ToList();

      return TheQueryFromDB ;
    }
}



返り値が必要な場合は、Tupleクラスを匿名型の代わりに使用できます。

注意:タプルには最大8つのパラメータを設定できます。

return Tuple.Create(variable1, variable2);

または、元の投稿からの例:

public List<Tuple<SomeType, AnotherType>> TheMethod(SomeParameter)
{
  using (MyDC TheDC = new MyDC())
  {
     var TheQueryFromDB = (....
                           select Tuple.Create(..., ...)
                           ).ToList();

      return TheQueryFromDB.ToList();
    }
}

http://msdn.microsoft.com/en-us/library/system.tuple(v=vs.110).aspx




C#コンパイラは2相コンパイラです。 第1段階では、名前空間、クラス階層、メソッドシグネチャなどをチェックするだけです。メソッド本体は第2段階でのみコンパイルされます。

匿名型は、メソッド本体がコンパイルされるまで決定されません。

コンパイラは、最初の段階でメソッドの戻り値の型を決める方法がありません。

これが匿名型を戻り型として使用できない理由です。

.net 4.0やそれを使用している場合には、 Dynamicを使用することもできます。

もし私があなたなら私はおそらくタイプを作成し、そのタイプをメソッドから返すでしょう。 そうすれば、あなたのコードを保持し、より読みやすい将来のプログラマーにとっては簡単です。






Related