2011-05-05 3 views
0

DSL 클래스 모양 속성에 대한 질문이 있습니다.DSL 도구 이름 및 유형 동적 목록

저는 일종의 DSL 도구를 만듭니다. 클래스 다이어그램과 같은 기능을 약간 갖고 싶습니다.

내 모델에 모양이 있습니다. 클래스 및 속성 및 작업을위한 구획 부분이 있습니다. 모델에는 특성 클래스와 연산 클래스가 있습니다. 나는 "NameAndType", "이름"과에 대한 책 에서 "비주얼 스튜디오 DSL 도구. 스티브 쿡, 가레스 존스, 스튜어트 켄트, 앨런 카메론 의지와 도메인 특정 개발"과 같은 atributtes은 "유형"속성을 생성

404 페이지.

잘 작동하지만 작업 클래스의 매개 변수에 대한 동적 목록을 갖고 싶습니다. 어떤 종류의 Collections 속성.

이제 opeations의 NameAndType Collections 속성을 만들고 싶습니다. 내 작업 (메서드)에서 사용하려는 매개 변수의 수를 선택하고 싶습니다. 동적 목록 (컬렉션 종류)이어야합니다.

어떻게하면됩니까?

감사 아담은

답변

3

나는 내 문제를 해결.

나는이 포럼에 이것을 적는다.

그래서, 내가 만든

도메인 클래스 (예를 들어 NameTypeList)의 속성처럼 내 자신의 컬렉션 편집기를 만들고 싶었 : 나는 다른 사람들이 아래

내 솔루션입니다 .A 도움이 될 것 같아요 사용자 정의 클래스 마녀에는 두 개의 필드 (string _name, string _type)가 있으며이 필드에 getter 및 setter가 있습니다. 이것은 NameType 클래스입니다.

[Serializable] 
public class NameType 
{ 
    public NameType() 
    { 
    } 

    private string _name; 

    public string Name 
    { 
     get { return _name; } 
     set { _name = value; } 
    } 

    private string _type; 

    public string Type 
    { 
     get { return _type; } 
     set { _type = value; } 
    } 
} 

이 클래스는 DSL 프로젝트의 주요 네임 스페이스에 : 우리는 아래에이 클래스의 코드를 볼 수 있습니다 (아래는이 클래스의 코드입니다).

다음으로 System.ComponentModel.Design.CollectionEditor 클래스를 사용하므로 System.Design 참조를 Dsl 및 DslPackage 프로젝트에 추가해야합니다.

도메인 클래스의 속성에 대한 사용자 지정 편집기를 만들 수 있습니다. Dsl 프로젝트에서 사용자 정의 코드 부분에 편집기 클래스를 작성해야합니다. 우리는 코드 아래 사용하는 것을 수행 할 수 있습니다

public class NameTypeEditor : System.ComponentModel.Design.CollectionEditor 
{ 
    public NameTypeEditor(Type t) 
     : base(t) 
    { 
    } 

    public override object EditValue(System.ComponentModel.ITypeDescriptorContext context, IServiceProvider provider, object value) 
    { 
     return base.EditValue(context, provider, value); 
    } 
} 

을 이제, 우리는 DSL 프로젝트에 우리의 사용자 정의 유형을 추가해야합니다. 트리의 루트에서 DSL Explorer에서 마우스 왼쪽 버튼을 클릭하고 "Add New External Type"을 선택하면됩니다.

다음으로 "List"와 Namespace를 "System.Collections.Generic"으로 채워야합니다. 그래서 우리는 커스텀 클래스 NameType의 객체의 일반적인리스트로서 새로운 타입을 가지고 있습니다.

그런 다음 DomainClass에서 새 속성 만 정의해야합니다 (예 :Domain 클래스에서 마우스 오른쪽 버튼을 클릭하고 Add-> DomainProperty를 선택하여 DslDefinition Designer를 선택하십시오.)

속성에서 이름을 예를 들어 NameTypeList로 정의하고 List를 Type으로 선택하고 Custom을 Kind로 선택하고 System과 같은 Custom Attributes를 설정해야합니다.

결국 DomainClass에서 선택한 NameTypeList 속성의 CustomStorage에 대한 메서드를 정의해야합니다. 예를 들어, 다음과 같습니다.

이 도메인 클래스의 부분 클래스를 만들고 GetNameTypeListValue 및 SetNameTypeListValue 메소드를 작성하면됩니다.

public partial class ClassElement 
{ 
    List<NameType> _nameTypeListClassParams = new List<NameType>(); 

    public List<NameType> GetNameTypeListValue() 
    { 
     return _nameTypeListClassParams; 
    } 

    public void SetNameTypeListValue(List<NameType> value) 
    { 
     if (value != null) 
      _nameTypeListClassParams = value; 
    } 
} 

이제 우리는 Collection Property NameTypeList를 가지며 쉽게 NameType 값 목록을 편집 할 수 있습니다.

모두 변형하고 빌드 한 후 실행하십시오.

이 방법으로이 문제를 해결했습니다. 이 충고가 도움이되기를 바랍니다.