2013-10-15 3 views
1

런타임에 EditorFor/DisplayFor 템플릿 (또는 이와 유사한)을 사용하여 MVC 스타일보기를 빌드하고자하는 경우가 있습니다.런타임에 코드 작성 및 변경

이상적으로 우리의 응용 프로그램은 UI에서 원하는 필드를 사용자가 선택할 수있게하여 (따라서 사용자가 적절하게 추가/제거 할 수 있음),이 시점에서 런타임시 뷰 모델을 작성하는 것이 편리 할 것이라고 생각합니다. 사용자가 선택한 것 (예 : 문자열 길이, 필수 항목 등)에 따라 다양한 데이터 주석 속성을 추가하십시오.

내가 지원할 수있는 한 가지는 런타임에 생성 된 클래스를 다른 사용자에게 영향을주지 않거나 전체 iisreset을 수행하지 않고 변경하는 것입니다.

나는이 연구에 대해 약간의 연구를 해왔으며 CodeDom, RunSharp/Relfection.Emit, Roslyn의 3 가지 접근법이있는 것으로 보입니다.

reflection.Emit/Runsharp를 통해 내가 클래스를 만들고 런타임에 attibutes와 속성을 추가 할 수있게 해 주었고 부작용없이 필요할 때 수정할 수도있었습니다.

Roslyn이 이것을 허용한다면, 나는 속성이나 속성을 가진 클래스를 만드는 간단한 예제를 추적 할 수 없었고, Roslyn의 출력은 다음과 같습니다. 불변이므로 불리한 영향을 미치지 않고 나중에 수정하도록 허용하는 방법이 확실하지 않습니다.

일반적으로 대부분의 사람들은 CodeDom을 권장하지 않으므로이 경로를 거쳐야하는지 완전히 확신 할 수 없습니다.

누구에게 내게이 지침 중 어떤 것이 나에게 유용 할 수 있는지 아이디어를 제공 할 수 있습니까?

+0

실제로 런타임에 유형을 만들어야합니까? 'Dictionary '와 같은 것이 충분하지 않습니까? – svick

답변

1

그래서 이러한 솔루션 중 아무 것도 작동하지 않으며 솔직히 런타임에서 유형을 생성하는 것이 실제로 원하는 것은 아닙니다.

CLR에서는 필드와 메서드가있는 형식이 있으면 런타임에 실제로 새 멤버를 추가하거나 멤버를 변경할 수 없습니다. 우리가 할 수있는 가장 가까운 것은 Visual Studio의 편집 - 계속 기능입니다. 우리는 우리가 할 수있는 변화에 크게 제한되어 있습니다. 우리는 종종 그들이 추가했다고 생각하는 곳에 메서드 나 속성을 추가하지 않음으로써 '속임수'를 사용하지만, 다른 곳에 숨기고 편집 할 때이 비밀 위치를 참조하는 IL을 내 보냅니다. 회원 제거와 같은 미친 일은 전적으로 지원되지 않습니다. 인 경우에도 많은 코드가 someObject.GetType().GetMembers()이 동일한 것을 반복해서 반환한다고 가정합니다.

Roslyn에 관한 한, 결과가 "불변"이라고 말할 때 우리는 그것이 당신이 생성 할 수있는 모든 일리노이에 어떤 요구 사항을 두는 것을 의미하지는 않습니다. 오히려 Roslyn에게 무언가를 파싱하거나 소스 코드를 분석하도록 요청하면 객체 (구문 트리, 유형 정보 등)가 변경되지 않습니다. 일단 CLR에 유형이 있으면 수정할 수 없기 때문에 문제가되지 않습니다.

나는 그의 의견에 svick이 있습니다. 이것은 당신이 원하는 것이 아닙니다. 어떻게 든 변형 될 수있는 구체적인 클래스로 생각하기보다는 런타임에 정보를 표현하기 위해 적절한 데이터 구조를 사용하십시오.

+0

그래, 나는 더 많은 연구를 해왔다. 생각하기 시작했다. 만약 우리가 사용자가 런타임에 타입을 바꿀 필요가 없다면, 코드에 내 prebuilt 클래스가있을 것이다. 그래서 내 아이디어는 가능한 한 클래스 전체를 동적으로 생성하여 시도하고 재현 한 다음 템플릿 용 객체에 대한 MVC 리플렉션과 같은 것을 사용하고 RavenDB를 사용하여 많이 수정하지 않고 저장합니다. –

+0

동적 인 내용이 필요한 경우 당신의 타입에서 Dictionary 을 사용하고 전통적인 의미에서 타입 안전성에 대해 걱정하지 마십시오. –

+0

예 저는 주로 MVC의 사전 바인딩과 관련된 몇 가지 문제로 인해 Key (문자열) 속성과 Value 속성 (객체)을 가진 Class와 함께 갈 것이라고 생각합니다. 실제로이 유형 이 접근법으로 내가 할 수있는 반성을 통해 말할 수있는 한 –