2009-05-01 2 views
1

ASP.NET 응용 프로그램에서 XML 문서에서 들어오는 속성을 사용하여 여러 컨트롤을 동적으로 렌더링하고 싶습니다. 여기 키커가 있습니다 : 나는 컨트롤 유형을 동적으로 결정할 수 있기를 원합니다. 그래서, 내 XML 문서에서, 나는 이런 식으로 뭔가를 가지고 :동적 렌더링 컨트롤, 문자열/XML 파일에서 유형을 결정 하시겠습니까?

<control> 
    <id>myControl1</id> 
    <type>CheckBox</type> 
    <text>Text For This Control</text> 
    </control> 

내가 ... 내가 수동으로 체크 박스와 같은 새로운 컨트롤을 인스턴스화로 모든 것이 너무 오래, 지금까지의 특성이가는대로, 잘 작동하는 얻을 수 있지만, 체크 박스를 만드는 방법, 텍스트 상자 또는 XML 정보를 기반으로하는 방법을 파악할 수없는 것 같습니다.

답변

4

아마도 제어 유형 이상으로 출력을 제어 할 수 있어야합니다. 나의 제안 :

public interface IControlProvider { 
    public Control GetControl(XmlElement controlXml); 
}; 

public class ControlProviderFactory : IControlProvider { 
    private Dictionary<string,IControlProvider> providers = new Dictionary<string,IControlProvider>(); 

    public ControlProviderFactory() { 
     //Add concrete implementations of IControlProvider for each type 
    } 

    public Control GetControl(XmlElement controlXml) { 
     string type = (controlXml.SelectSingleNode("type") as XmlElement).InnerText; 
     if(!providers.ContainsKey(type) throw new Exception("No provider exists for " + type); 
     return providers[type].GetControl(controlXml); 
    } 
} 

당신은 대신 알 수없는 공급자 유형가 발생할 때 예외를 던지는이 사용 Activator.CreateInstance로 비 등록 유형에 대한 대체로서 ReflectionControlProvider를 추가 할 수 있습니다. 이렇게하면 렌더링의 특정 제어와 동적 생성 모두에 대해 최대한의 유연성을 얻을 수 있습니다.

+1

+1 멋지고 유연한 답변입니다. 그러나 때로는 힘든시기라고 생각합니다. –

+0

약 두 달 전에 동의했을 것입니다. 그러나 Open Closed 원칙을 충족시키기 위해이 코딩 스타일을 사용하기 시작한 이래로 왜 그런 식으로 모든 것을 구축하지 않았는지 이해할 수 없습니다. 확장하기 쉽고 코드를 수정할 필요가 없으므로 코드를 수정할 필요가 없습니다. 새로운 공급자를 추가하기 만하면됩니다. –

+0

좋아, 지금까지 이걸 가지고있어 유형을 얻는 것이 더 이상 문제가 아니지만 다른 속성을 할당하는 것이 나의 새로운 문제로 보인다 ...? 당신은 타입을 넘어서는 출력을 제어 할 수있는 능력을 암시합니다. 올바른 방향으로 나를 설정하기 위해 줄 수있는 다른 포인터가 있습니까? 지금까지 도와 주셔서 감사합니다. –

1

유효한 유형의 Dictionary<string, Type>을 만들거나 Activator.CreateInstance으로 이름을 지정하여 인스턴스를 만들 수 있습니다.

관련 문제