2011-05-11 4 views
2

나는 .NET BackgroundWorker 클래스를 가지고 놀고있다. 이 기능의 일부로, 선택적인 사용자 매개 변수와 함께 백그라운드 작업이 완료 한 백분율로 전달할 수있는 ReportProgress이라는 메서드를 호출 할 수 있습니다.개체에 익명 형식을 연결했습니다. 그것을 검색하는 방법?

결국 ReportProgress은 이벤트 처리기를 호출하고 선택적 user 매개 변수는 이벤트 인수의 "UserState"멤버가됩니다.

여기에 분명히 존재하고 있지 않다 경우 빠른 샘플입니다 :

BackgroundProcess.ReportProgress(100, new{title="complete"}); 
/*****later on, this method is called******/ 
private void myEventHandler(object sender, RunWorkerCompletedEventArgs e) 
{ 
    //e.UserState is my anonymous type defined in the call to ReportProgress(...) 
} 

내 질문에, 어떻게 내 익명 형식의 "제목"값에 액세스 할 수 있습니까? 나는 내가 반사를 사용해야한다고 생각하지만, 지금까지 나는 운이 좋지 않다.

+2

어리석은 일회성 유형을 정의해야한다는 것은 짜증나지만, 가장 관용적이며 가장 깨끗한 해결책은 여기에 title 속성으로 명명 된 유형을 정의하는 것입니다. 왜 반사에 귀찮았습니까? – mquander

+2

하지만 필요한 것은 제목뿐입니다. 왜 객체를 정의해야합니까? 그냥 문자열을 전달하고 이벤트 핸들러에서 문자열로 캐스팅하면됩니다. –

+0

귀하의 질문은 완전히 유효합니다. 그러나 지금은 학문적 인 질문입니다. 저는 이것을 반사회적으로 사용하도록 노력하고 있습니다. 매회 생각하고 있습니다. 그렇지 않습니다. – larryq

답변

4

것은 당신이 C# 4.0 사용하는 경우

dynamic o = e.UserState; 
o.title; 

당신에게 사용 반사, 그러나 크고, 느리고 추악 할 것입니다. 명명 된 유형이 더 현명합니다.

3

익명 개체를 사용하지 마십시오. 그것들은 현재의 메소드에만 적용됩니다. 일단 정의 된 현재 메소드의 범위를 벗어나면 접근은 PITA가됩니다. 그래서 간단한 클래스를 정의하고이 클래스에 캐스트 :

BackgroundProcess.ReportProgress(100, new MyClass { Title = "complete" }); 

다음 :

private void myEventHandler(object sender, RunWorkerCompletedEventArgs e) 
{ 
    var title = ((MyClass)e.UserState).Title; 
} 
+0

고마워 ... 내 방식대로 시도하는 PITA 부분의 의미를 알 수 있습니다. – larryq

1

값을 전달할 클래스를 생성해서는 안되며 이유가 없습니다. 가능성에

dynamic에 캐스팅하고 나는 그것을을하지 않는 것이 좋습니다 재산하지만 을 받고있다.

관련 문제