[c#] C #에서 익명 형식 반환

익명 형식을 반환하는 쿼리가 있고 쿼리가 메서드에 있습니다. 이것을 어떻게 작성합니까?

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

      return "TheAnonymousType";
    }
}



답변

당신은 할 수 없습니다.

당신은 반환 할 수 있습니다 object, 예를 들어, 또는 객체의 용기 IEnumerable<object>, IList<object>


답변

dynamic익명 유형의 런타임 확인 버전을 제공하지만 .NET 4+에서만 반환 할 수 있습니다.


답변

C # 7에서는 튜플을 사용하여이를 수행 할 수 있습니다.

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

      return TheQueryFromDB
                .Select(s => (
                     SomeVariable = s.SomeVariable,
                     AnotherVariable = s.AnotherVariable))
                 .ToList();
  }
}

System.ValueTuple그래도 너겟 패키지 를 설치해야 할 수도 있습니다 .


답변

익명 형식은 반환 할 수 없습니다. 반환 할 수있는 모델을 만들 수 있습니까? 그렇지 않으면 object.

다음은 주제에 대해 Jon Skeet이 작성한 기사입니다.

기사의 코드 :

using System;

static class GrottyHacks
{
    internal static T Cast<T>(object target, T example)
    {
        return (T) target;
    }
}

class CheesecakeFactory
{
    static object CreateCheesecake()
    {
        return new { Fruit="Strawberry", Topping="Chocolate" };
    }

    static void Main()
    {
        object weaklyTyped = CreateCheesecake();
        var stronglyTyped = GrottyHacks.Cast(weaklyTyped,
            new { Fruit="", Topping="" });

        Console.WriteLine("Cheesecake: {0} ({1})",
            stronglyTyped.Fruit, stronglyTyped.Topping);
    }
}

또는 다른 유사한 기사가 있습니다.

또는 다른 사람들이 댓글을 작성할 때 다음을 사용할 수 있습니다. dynamic


답변

반환이 필요한 경우 익명 형식 대신 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 단계 컴파일러입니다. 첫 번째 단계에서는 네임 스페이스, 클래스 계층 구조, 메서드 서명 등 만 확인합니다. 메서드 본문은 두 번째 단계에서만 컴파일됩니다.

익명 형식은 메서드 본문이 컴파일 될 때까지 결정되지 않습니다.

따라서 컴파일러는 첫 번째 단계에서 메서드의 반환 유형을 결정할 방법이 없습니다.

이것이 익명 유형을 반환 유형으로 사용할 수없는 이유입니다.

.net 4.0 또는 grater를 사용하는 경우 다른 사람들이 제안했듯이 Dynamic.

내가 당신이라면 아마도 유형을 만들고 메서드에서 해당 유형을 반환 할 것입니다. 이렇게하면 코드를 유지하고 더 읽기 쉬운 미래의 프로그래머가 쉽게 사용할 수 있습니다.


답변

세 가지 옵션 :

옵션 1:

public class TheRepresentativeType {
    public ... SomeVariable {get;set;}
    public ... AnotherVariable {get;set;}
}

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

     return TheQueryFromDB;
   }
}

옵션 2 :

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

객체로 반복 할 수 있습니다.

옵션 3 :

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

     return TheQueryFromDB; //You may need to call .Cast<dynamic>(), but I'm not sure
   }
}

동적 개체로 반복하고 속성에 직접 액세스 할 수 있습니다.