2013-01-06 3 views
-1

내 질문과 관련된 여러 게시물을 읽었지만 특정 문제를 해결하지 못했습니다.런타임 캐스팅

아래 클래스는 분석을 위해 Razor 엔진에 정보를 전달할 정보를 보유하고 있습니다.

public class ActionResult 
{ 
    public object ViewModel { get; set; } 
    public string View { get; set; } 
} 

ActionResult.ViewModel 속성은 내 의견이 강력하게 형식화 된대로 내보기 필요한 사용자 정의 유형이 될 수있는 뷰 모델 클래스의 인스턴스를 개최한다.

나는 면도기 엔진을 새로 시험 할 것이다.

var razorEngine = new RazorEngine(razorScriptFile, _moduleResult.ModuleContext, ""); 

후 내가 가진 문제는 내가이가 actionResult 인스턴스 내에서 정보를 사용하는 방법을 렌더링 호출하는 방법에 확실하지 오전 것입니다 ... 그것은 서명이있어,

public void Render<T>(TextWriter writer, T model){} 

을 렌더링 메소드를 호출 런타임에 사용할 수 있습니다.

나는 방법은 호출 하드 코드가 잘 작동하면 ...

razorEngine.Render<MyViewModelType>(writer, actionResult.ViewModel); 

는하지만 난 내가 MyViewModelType로 actionResult.ViewModel을 받고 일을하거나 그냥 MyViewModelType 캐스팅되어야 하는지를 같아요. 하지만 런타임에 Type을 제공하는 동안 razorEngine.Render() 메서드를 호출하는 방법을 모르겠습니다. 닷넷 4.5

편집을 ...

내가 내가 내가 할 수 있다고 생각하는 것 같다 ..

Type type = actionResult.ViewModel.GetType(); 
var model = actionResult.ViewModel as type; 

하지만를 사용

+0

리플렉션을 사용하거나 Object를 전달해야합니다. – SLaks

+0

razorEngine.Render (writer, (MyViewModelType) actionResult.ViewModel)에 문제가 있습니까? 나는 어려움이 무엇인지 이해하지 못한다. – Asik

+0

면도기 엔진에서 render 메서드를 호출 할 때 모델 매개 변수는 면도기 뷰에 입력 된 것과 동일한 유형이어야합니다. 내 단점은 런타임에 모델을 개체 형식에서 필요한 사용자 지정 형식 (MyViewModel)으로 캐스팅하는 것입니다. – JBeckton

답변

1

당신이 사용할 수있는 작동하지 않습니다 필요한 것을 얻기위한 성찰 :

var viewModel = actionResult.ViewModel; 
var method = typeof (RazorEngine).GetMethod("Render"). 
    MakeGenericMethod(viewModel.GetType()); 
method.Invoke(razorEngine, new[] {writer, viewModel}); 

의견이 적절하게 언급 된대로 viewModel을 원하는 유형으로 캐스팅 할 수없는 이유는 무엇입니까?

편집 : 나는 당신이 추가 검사를 추가하여 코드를 안전하게 만들기 위해 제안 그러나

var method = typeof (RazorEngine).GetMethods(). 
    Single(m => m.Name == "Render" && m.ContainsGenericParameters). 
    MakeGenericMethod(viewModel.GetType()); 

: Render의 유일한 다른 오버로드는 다음과 같은 코드를 사용할 수있는 제네릭이 아닌 Render(TextWriter)이기 때문에. 새 버전 Render에 제네릭 매개 변수로 새 오버로드가 발생하면 위 코드에서 예외가 발생합니다. Single 대신 First을 사용할 수 있지만 위와 같이 라이브러리가 업데이트를 얻으면 코드에 버그가 발생할 수 있습니다.

+0

동의합니다. 왜 안되나요? 런타임에 원하는 유형이 결정되므로이 작업을 올바르게 수행하는 구문 또는 표현식은 무엇입니까? – JBeckton

+0

'viewModel'의 실제 타입이 결정되면 (원래의 질문에서 나는 미리 정의 된 타입을 제네릭 메소드로 전달하려고합니다) 런타임에 제 질문에 제공된 메소드가 당신을 위해 작동 할 것입니다. – Mir

+0

그래서 이것을 얻으려면 Reflection을 사용해야합니까? – JBeckton