2011-09-23 6 views
4

나는 MVC3 RouteValueDictionary를 익명 타입으로 신속하게 변환하고 싶습니다. 예를 들어RouteValueDictionary를 익명 객체로 변환하는 빠른 방법은 무엇입니까?

:

new RouteValueDictionary(){{"action","search"}} 

이 실행시에 할 수 없습니다

new {action="search"} 
+1

왜 이렇게해야합니까? –

+0

@Darin : Ajax.ActionLink를 사용하고 저장된 경로 객체를 전달하려고합니다. 마침내 내가 OP에서 물었던 것을 해내려고 시도하고 대신 RouteValueDictionary를 전달하면서 정확한 오버로드를 처리했습니다. 여전히 해결책이 궁금해서 대답하지 않은 상태로 남겨 두십시오. –

답변

5

과 같은 것입니다. 익명 형식의 속성은 컴파일 타임에 미리 알아야합니다.

1

NB이 대답은 프로덕션 코드에 사용해서는 안되지만 재미 있다고 생각한다는 사실에 기인합니다.

당신이 관심있는 사전 키를 모두 가지고 그 익명의 유형 (템플릿)을 구성 할 수 있다면, 당신은 다음과 같은 방법을 사용할 수 있습니다

public static class RouteValueDictionaryExtensions 
{ 
    public static TTemplate ToAnonymousType<TTemplate>(this RouteValueDictionary dictionary, TTemplate prototype) 
    { 
    var constructor = typeof(TTemplate).GetConstructors().Single(); 

    var args = from parameter in constructor.GetParameters() 
     let val = dictionary.GetValueOrDefault(parameter.Name) 
     select val != null && parameter.ParameterType.IsAssignableFrom(val.GetType()) ? (object) val : null; 

    return (T) constructor.Invoke(args.ToArray()); 
    } 
} 

하는 것은 다음 사용 가능한 것 좋아요 :

var dictionary = new RouteValueDictionary {{"action", "search"}}; 
var anonymous = dictionary.ToAnonymousType(new { action = default(string) }); 
+0

프로덕션 환경에서 사용하지 않는 이유는 무엇입니까? 내가 코드를 추가하고 그것을 디버깅하고 무슨 일을 볼 실행했지만 LINQ 문을 컴파일하지 않으며 그것을 수정하는 방법을 잘 모르겠습니다. – ChadD

관련 문제