DSL Tool NameAndType динамический список - PullRequest
0 голосов
/ 05 мая 2011

У меня вопрос по поводу свойств формы класса DSL.

Я создаю своего рода инструмент DSL. Я хочу, чтобы функциональность была немного похожа на диаграмму классов.

У меня есть фигуры в моей модели. У меня есть Class Shape с частью купе для атрибутов и операций. В модели у меня есть класс атрибута и класс операции.

Я создал свойства «NameAndType», «Name» и «Type» для атрибутов, как в книге "Специфичная для домена разработка с помощью инструментов Visual Studio DSL. Стив Кук, Гарет Джонс, Стюарт Кент, Алан Кэмерон Уиллс "на 404 странице.

Отлично работает, но я хочу иметь динамический список параметров в классе операций. Какая-то собственность Коллекции.

Теперь я хочу создать свойство NameAndType Collections для операций. Я хочу выбрать, сколько параметров я хочу использовать в своей операции (метод). Это должен быть динамический список (своего рода коллекция)

Вы знаете, как я могу это сделать?

С уважением Адам

1 Ответ

4 голосов
/ 08 мая 2011

Я решаю свою проблему.

Я записываю это на этом форуме. Я думаю, что это может быть полезно для других .A

Ниже мое решение:

Итак, я хотел создать свой собственный редактор коллекций, как свойство в классе домена (например, NameTypeList)

Я создал собственный класс witch, в котором есть два поля (строка _name, string _type) и есть методы получения и установки для этих полей. Это класс 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 в корне дерева и выбрав «Добавить новый внешний тип».

Далее мы должны заполнить Имя как «Список» и Пространство имен как «System.Collections.Generic». Итак, у нас есть новый тип как общий список объектов нашего пользовательского класса NameType.

После этого нам нужно только определить новое свойство в нашем DomainClass (например, в DslDefinition Designer, щелкнув правой кнопкой мыши по классу домена и выбрав Add-> DomainProperty)

В Свойствах мы должны определить Имя как, например, NameTypeList, выбрать Тип как Список, выбрать Вид как CustomStorage и установить Пользовательские Атрибуты, такие как System.ComponentModel.Editor {typeof (NameTypeEditor), typeof (System.Drawing.Design.UITypeEditor)}

В конце мы должны определить методы для CustomStorage для нашего свойства NameTypeList, которое мы выбираем в нашем DomainClass.

Мы можем сделать это, создав частичный класс этого класса домена и написав методы 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 NameTypeList, и мы можем легко редактировать наш список значений NameType.

Преобразуйте все, соберите и запустите.

Я решил эту проблему таким образом. Я надеюсь, что этот совет поможет вам.

...