2011-08-01 2 views
5

C# asp.net4를 사용합니다.익명 형식을 개체에 캐스팅하고 하나의 필드를 검색하십시오.

 var parentCategories = from c in context.CmsCategories 
           where c.CategoryNodeLevel == 1 
           select new { c.Title, c.CategoryId }; 
     uxRepeter.DataSource = parentCategories; 
     uxRepeter.DataBind(); 

내가 각각의 텍스트 속성을 변경해야합니다, 리피터 안에 나는 또한 레이블을 배치 :

나는 익명 형식 (제목, 카테고리 ID는 필드)을 가진 리피터를 채우는 방법을 리피터 이벤트에 내 중계기 내부 라벨은 그래서 e.Item (또는 더 좋은 방법이있는 경우)를 사용하여 Label.Text에 대한 속성을 설정해야합니다

protected void uxRepeter_ItemDataBound(object sender, RepeaterItemEventArgs e) 
    { 
     HyperLink link = (HyperLink)e.Item.FindControl("uxLabel"); 
     uxLabel.Text = // How to do here!!!!!!!! 
    } 

을하여 ItemDataBound.

내 문제 e.Item (익명 형식 필드 제목)을 CAST 할 수없고 내 레이블의 텍스트 권한으로 설정할 수 없습니다.

저는 익명 형식을 개체 유형에만 캐스팅 할 수 있다고 생각합니다. 그러나 제 경우에는 익명 형식이 제목과 범주 필드를 가지고 있습니다.

내 질문 :

내가 관심있는 분야를 캐스팅하고 검색하는 방법은 무엇입니까? 이 시간 내 주셔서 감사합니다.

편집 : 일부 오류가 나는 나타날 수

Unable to cast object of type '<>f__AnonymousType0`2[System.String,System.Int32]' to type 'System.String'. 

답변

10

옵션 조셉 선물은 좋은 사람이지만, 은 당신이 할 수있는 끔찍한 방법은이 : 나는 코드가 될 것이다 생각합니다. 다소 희박합니다. 익명 유형을 에 정확히 지정하면 두 위치에서 똑같은 방법으로을 지정할 수 있습니다. 여기에 우리가 간다 : 그리고

public static T CastByExample<T>(object input, T example) 
{ 
    return (T) input; 
} 

:

object item = ...; // However you get the value from the control 

// Specify the "example" using the same property names, types and order 
// as elsewhere. 
var cast = CastByExample(item, new { Title = default(string), 
            CategoryId = default(int) }); 
var result = cast.Title; 

편집 : 또한 주름 - 두 개의 익명 형식의 창작 표현이 동일한 어셈블리 (프로젝트)에 있어야합니다. 죄송합니다. 지금까지는 언급하지 않았습니다.

+0

내가 궁금해 한 것 - 동일한 모양의 두 익명 유형이 유형 호환성이 있거나 구현해야하는 사양의 일부인 구현 세부 사항입니까? –

+0

귀하의 포괄적 인 코드에 대해 Jon에게 감사드립니다. – GibboK

+3

@ 렉스 : 사양의 일부입니다. 나에게는 참조가 없지만 기본적으로 같은 어셈블리 * 내에서 동일한 속성 이름과 형식을 가진 두 개의 익명 형식 생성식이 같은 순서로 참조되어야합니다. –

4

당신은 기본적으로 이미 지적했듯이 말 그대로, 그것을 캐스팅 할 타입이 없기 때문에 당신은 아무것도에 익명 형식을 캐스팅 할 수 없습니다.

그래서 두 가지 옵션이 있습니다.

  1. 는 익명의 형식으로 캐스팅하지 마십시오, 오히려이 시나리오 또는
  2. 을 처리하기위한 단지 구축 알려진 유형의 항목에 대한 동적 변수를 할당하고 동적 속성을 사용하는 대신

예 1 :

var parentCategories = from c in context.CmsCategories 
    where c.CategoryNodeLevel == 1 
    select new RepeaterViewModel { c.Title, c.CategoryId }; 

예 2 :

(또한 난 당신이 링크 VAR를 할당하는 의미 마지막 줄을 것 같아요)
protected void uxRepeter_ItemDataBound(object sender, RepeaterItemEventArgs e) 
{ 
    HyperLink link = (HyperLink)e.Item.FindControl("uxLabel"); 
    dynamic iCanUseTitleHere = e.Item; 
    link.Text = iCanUseTitleHere.Title; //no compilation issue here 
} 
+0

답장을 보내 주신 Joesph에게 감사드립니다. Ex 1 대신에 예 2에 대한 단점이 있습니까? 이 시간에 감사드립니다. – GibboK

+1

@GibboK 글쎄, 당신은 강력한 타이핑을 잃어 버렸습니다. 그래서 이벤트 처리기를 만지는 모든 개발자는 그 객체에서 액세스 할 수있는 것을 이미 알아야합니다. 첫 번째 예제를 사용하면 강력한 타이핑을 얻을 수 있으며 이벤트 핸들러에서 알아야 할 것은 e.Item을 캐스팅 할 클래스입니다. 컴파일 타임에 알려진 모든 것. – Joseph

+0

Josef님께 서 의견을 주신 것에 게 감사드립니다. – GibboK

4

이 경우 dynamic을 사용할 수 있습니다.

protected void uxRepeter_ItemDataBound(object sender, RepeaterItemEventArgs e) 
{ 
    dynamic link = (dynamic)e.Item.FindControl("uxLabel"); 
    uxLabel.Text = link.Title; //since 'link' is a dynamic now, the compiler won't check for the Title property's existence, until runtime. 
} 
0

(typeof(new { Title = "", CategoryID = 0 }))으로 전송할 수 없습니까?

관련 문제