2009-04-03 4 views
11

익명 형식의 개체에 해당 범위 밖에있는 개체에 액세스하려면 어떻게해야합니까?C# 익명 형식 개체 액세스

void FuncB() 
{ 
var obj = FuncA(); 
Console.WriteLine(obj.Name); 
} 

??? FuncA() 
{ 
var a = (from e in DB.Entities 
where e.Id == 1 
select new {Id = e.Id, Name = e.Name}).FirstOrDefault(); 

return a; 
} 

답변

26

다른 답변에서 설명한 바와 같이 을 사용하면 안됩니다.. 그러나, 만약 당신이 주장한다면, 당신이 그것을 할 수있게 해주는 "예시에 의한 캐스트"로 알려진 더러운 해킹이 있습니다. 기술은 두 개의 기사, herehere에 언급되어 있습니다.

public void FuncB() 
{ 
    var example = new { Id = 0, Name = string.Empty }; 

    var obj = CastByExample(FuncA(), example); 
    Console.WriteLine(obj.Name); 
} 

private object FuncA() 
{ 
    var a = from e in DB.Entities 
      where e.Id == 1 
      select new { Id = e.Id, Name = e.Name }; 

    return a.FirstOrDefault(); 
} 

private T CastByExample<T>(object target, T example) 
{ 
    return (T)target; 
} 

(나는 the author of one of those articles says that he doesn't want to be associated with it either 있지만,이 해킹을 위해 신용을받을 수 없어 그의 이름은 익숙 할 수도 있습니다.).

+0

8 초마다 패배! 나는 내 것을 삭제했다. (복제에 도움이되지 않는다.) 그러나 강조하기 위해 : *** *** 이것을하지 마십시오 *** ;-p –

+0

당신은 이것을 당신이 선호하는 대답으로 받아 들였습니다. 흥미로운 기술이지만 중요한/프로덕션 코드에서 사용하는 것을 강력히 권장합니다! – LukeH

+1

예. 이 일을 할 수 있다는 것을 아는 것이 좋다. 그래도 나는 정말로 악합니다. 그렇습니다. 나는 muhahhhhahahaaaa입니다. –

7

함수에서 익명 형식을 반환 할 수 없습니다. MSDN documentation에서

:

은 익명의 유형 또는 메소드 경계 외부 익명 유형이 포함 컬렉션을 통과하려면, 먼저 반대 할 유형을 캐스팅해야합니다. 그러나 이것은 익명 형식의 강력한 입력을 무효화합니다. 쿼리 결과를 저장하거나 메서드 경계 외부로 전달해야하는 경우 익명 형식 대신 일반 명명 된 구조체 또는 클래스를 사용하는 것이 좋습니다.

1

익명 형식은 컴파일러에서 생성 된 클래스이며 컴파일러는 클래스 자체의 이름을 알려주지 않습니다. 따라서 object에 대한 참조를 반환하는 것 이외의 다른 함수에서이 클래스의 인스턴스를 반환 할 수있는 방법은 없습니다.

1

음, 그 대답은 : 익명의 타입을 선언 된 범위 밖에서 사용하지 마십시오. 이 경우 간단한 유형을 작성하십시오.

0

이 사건에 대한 클래스 만들 것입니다 :

public class LISTFUNCA 
{       
    public int identificacion; 
    public string nombre;  
}  

을 다음 :

public List<LISTFUNCA> FuncA() 
{           
    var lista = (from e in DB.Entities where e.Id == 1       
       select new { identificacion = e.Id, nombre = e.Name}) 
       .FirstOrDefault(); 
    return lista.ToList(); 
}  
+1

코드를 검토하십시오. 나는 그것을 다시 형식화했다. 그러나 그것이 정확하지 않다고 나는 믿는다. 또한 코드의 형식을 올바르게 지정하는 방법에 대한 자세한 내용은 [FAQ]를 참조하십시오. 그리고 무언가를 게시 할 때 무서운 것처럼 보일 수도 있습니다. [수정하려면 게시물을 편집 할 수 있습니다.] (http://stackoverflow.com/posts/2509405/edit) – Will

2

.NET 4.0을 사용하는 경우 튜플을 사용할 수 있습니다. a Tuple<int, string>. 2.0/3.5 용으로 자체 Tuples을 구현할 수 있으며 실제로 다른 사람들이 이미 가지고 있으므로 원하는 경우 할 수 있어야합니다.

0

오픈 소스 프레임 워크 Impromptu-Interface을 사용하면 익명 객체를 인터페이스로 캐스팅 할 수 있습니다. 어셈블리 경계에서 예상대로 작동하기 때문에 해킹이 적다는 이점이 있습니다. 경량 프록시와 dlr을 사용하여이 작업을 수행합니다.