2009-08-25 5 views
43

같은 방법을 쓸 수 없다는 걸 알았습니다.메서드에서 익명 형식을 반환 할 수있는 방법이 있습니까?

public var MyMethod() 
{ 
    return new{ Property1 = "test", Property2="test"}; 
} 

달리 할 수 ​​있습니다.

public object MyMethod() 
{ 
    return new{ Property1 = "test", Property2="test"} 
} 

하지만 두 번째 옵션을 사용하고 싶지 않습니다. 나는 성찰을 사용해야 할 것이다.



왜 내가하고 싶어 :

오늘 결과로 datatable를 반환합니다 내 aspx 페이지 안에 메서드가 있고 그것을 변경할 수 없습니다,이 DataTable을 변환하려고했습니다. 익숙한 메서드로 작업하려는 속성이 있습니다. 나는 그것을 수행하기 위해서만 클래스를 생성하고 싶지 않았고 동일한 쿼리를 두 번 이상 수행해야하므로 익명의 타입을 반환하는 메소드를 만드는 것이 좋은 아이디어가 될 것입니다.

+0

무엇에 사용 하시겠습니까? 어떻게 그런 식으로하고 싶다는 결론에 도달 했습니까? – Guffa

+0

@ Guffa, 결과로 datatable을 반환하는 aspx 페이지 안에 메소드가 있습니다.이 datatable을 익명 메소드로 변환하려고했습니다. 클래스를 생성하기를 원하지 않았고 같은 쿼리를 두 번 이상 수행해야하므로 익명 메소드를 반환하는 메소드를 생성하는 것이 좋은 아이디어가 될 것입니다. – Cleiton

+1

@Cleiton - 데이터를 포함 할 클래스를 만드는 데 훨씬 적은 노력이 필요합니다. 익명 형식을 사용하여 데이터를 쉽게 조작 할 수 있기 때문에 하나의 레이어에서 다른 레이어로 전달해야 할 때 이러한 유형을 정의하는 클래스를 만드는 것을 중지해야한다는 것을 의미하지는 않습니다. – Jagd

답변

57

System.Object으로 반환하면 익명 형식을 메서드에서 반환하는 방법은 입니다. 불행히도 익명 형식은 이러한 방식으로 사용되지 않도록 특별히 설계 되었기 때문에이 작업을 수행 할 수있는 다른 방법은 없습니다.

가까워 질 수있는 Object을 반환하는 것과 함께 할 수있는 몇 가지 트릭이 있습니다. 이 해결 방법에 관심이 있으시면 Can't return anonymous type from method? Really?을 읽어보십시오.

면책 조항 : 비록 내가 링크 된 문서가 그것을하는 것이 좋은 생각을 의미하는 것은 아닙니다. 일반 유형을 만들 때 더 안전하고 이해하기 쉬울 때이 접근법을 사용하는 것이 좋습니다.

+10

이것은 권장되는 아이디어가 아닙니다. . Intellisense는 더 이상 익명 형식의 강력하게 형식화 된 속성 (예 : Property1 및 Property2)을 인식하지 않습니다. 사실 리플렉션을 사용하여 속성에 접근 할 수 있지만, 작업을하기 위해 망치로 엄지 손가락을 치고있을 수도 있습니다. 당신의 인생을 더 편하게 해주는 뭔가를 가져 갔음은 말할 것도 없습니다. , 실제로 그것을 더 단단하게했다. – Jagd

+0

+1 자신을 더 잘 말할 수 없었습니다. 예, 할 수 있지만 좋은 아이디어는 아닙니다. –

+0

할 수 있습니다! _ 그냥 p.i.t.a._ –

1

아니요 익명 형식은 해당 형식이 만들어지는 컨텍스트 외부에 존재할 수 없으며 결과적으로 메서드 반환 형식으로 사용할 수 없습니다. 인스턴스를 object으로 반환 할 수는 있지만이 용도로 컨테이너 유형을 명시 적으로 만드는 것이 더 좋습니다.

0

죄송합니다. 정말 그렇게하기로되어 있지 않습니다. 리플렉션 또는 일반적인 도우미 메소드를 사용하여 유형을 반환하도록 해킹 할 수 있지만 그렇게하면 언어에 대해 실제로 작업하게됩니다. 무슨 일이 일어나고 있는지 분명히 알리기 만하면됩니다.

2

앤드류 토끼가 맞다고 생각하면 "객체"를 반환해야합니다. 편집 주석에 대해서는 OO 코드의 원시 객체를 다루는 것이 "코드 냄새"가 될 수 있다고 생각합니다. 대부분의 경우, 반환 할 인터페이스를 정의하는 것이 좋을 것입니다. 또는 관련 유형을 반환하려는 경우 일종의 기본 클래스 유형을 사용하는 것이 좋습니다.

1

아니요, 메서드 외부에서 익명 클래스의 범위를 확장 할 수는 없습니다. 이 메서드 밖에서 클래스는 진정으로 익명이며, 리플렉션 만이 멤버에 액세스 할 수있는 유일한 방법입니다.

13

가장 쉬운 해결책은 클래스를 만들고 속성에 값을 저장 한 다음 반환하는 것입니다. 익명의 타입이 당신의 삶을 열심히 만든다면 당신은 그것을 올바르게 사용하지 않을 것입니다.

13
public object MyMethod() 
{ 
    return new 
    { 
     Property1 = "test", 
     Property2 = "test" 
    }; 
} 

static void Main(..) 
{ 
    dynamic o = MyMethod(); 
    var p1 = o.Property1; 
    var p2 = o.Property2; 
} 
21

또는 .NET 4에서 Tuple 클래스를 사용할 수 있습니다.0 이상이 같은

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

Tuple<string, string> Create() 
{ 
return Tuple.Create("test1", "test2"); 
} 

다음 액세스 할 수있는 속성 :이 좋은 생각인지 여부에 대한 경고에도 불구하고

var result = Create(); 
result.Item1; 
result.Item2; 
+8

웃기는 군. 여기 리턴 유형으로 튜플을 사용하는 대안을 찾고자했다. – SixOThree

6

... dynamic 보인다 개인적인 방법으로 잘 작동합니다.

private dynamic MyMethod() 
{ 
    return new { Property1 = "test", Property2 = "test" } 
} 
+0

동적 인 것은 객체를 포함하여 모든 데이터 유형에 빌드되므로 오브젝트가 더 좋을수록 오버 헤드가 적어 지므로 최상은 아니라고 생각합니다. – MrKekson

관련 문제