DSL 工具 NameAndType 动态列表

发布于 2024-11-05 08:27:19 字数 435 浏览 4 评论 0原文

我有关于 DSL 类形状属性的问题。

我创建了一种 DSL 工具。我想要的功能有点像类图中的功能。

我的模型中有形状。我有类形状,其中包含属性和操作的隔间部分。 在模型中,我有属性类和操作类。

我为书中的属性创建了“NameAndType”、“Name”和“Type”属性 “使用 Visual Studio DSL 工具进行特定领域的开发。 Steve Cook、Gareth Jones、Stuart Kent、Alan Cameron Wills”在 404 页上。

它工作得很好,但我想在操作类中拥有参数的动态列表。某种 Collections 属性。

现在我想为操作创建 NameAndType Collections 属性。 一种集合)

你知道我该怎么做吗?

我想选择在我的操作(方法)中使用多少个参数,这必须是动态列表( 亚当

I have a question about DSL Class Shape Properties.

I create a kind of DSL Tool. I want to have functionality a little bit like in class diagram.

I have shapes in my model. I have Class Shape with compartment part for attributes and operations.
In model I have attribute class and operation class.

I created "NameAndType", "Name" and "Type" property for atributtes like in book
"Domain-Specific Development with Visual Studio DSL Tools.
Steve Cook, Gareth Jones, Stuart Kent, Alan Cameron Wills" on 404 page.

It works great but I want to have dynamic list for parameters in operations class. Some kind of Collections property.

Now I want to create NameAndType Collections property for opeations. I want to choose how many parameters I want to use in my operation(method). That must be dynamic list (a kind of collection)

Do you know how can I do this?

Regards
Adam

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

情定在深秋 2024-11-12 08:27:19

我解决我的问题。

我把这个写在这个论坛上。我认为这可能对其他人有帮助。

下面是我的解决方案:

所以,我想创建自己的集合编辑器,就像域类中的属性(例如NameTypeList)一样,

我创建了具有两个字段(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 中单击鼠标左键并选择“添加新外部类型”来完成此操作。

接下来,我们必须将名称填写为“List”,将命名空间填写为“System.Collections.Generic”。因此,我们有新类型作为自定义类 NameType 的对象的通用列表。

之后,我们只需在 DomainClass 中定义新的 Property(例如,在 DslDefinition Designer 中,在 Domain Class 上单击鼠标右键,然后选择 Add->DomainProperty)。

在 Properties 中,我们必须将 Name 定义为例如 NameTypeList,选择 Type 作为 List ,选择 Kind 作为 CustomStorage 并设置自定义属性,如 System.ComponentModel.Editor {typeof(NameTypeEditor), typeof(System.Drawing.Design.UITypeEditor)}

最后我们必须定义我们在 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;
    }
}

现在我们有了集合属性 NameTypeList,我们可以轻松地编辑 NameType 值列表。

改造一切、构建并运行它。

我用这种方法解决了这个问题。我希望这个建议对你有帮助。

I resolve my problem.

I write down this on this forum. I think it might be helpful for others .A

Below is my solution:

So, I wanted to create my own Collection Editor like a property in a Domain Class (e.g. NameTypeList)

I created custom class witch have two fields (string _name, string _type) and have getters and setters for these fields. This is NameType Class . We can see code of this class below (Below is the code of this class):

[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; }
    }
 }

This class is in the main namespace of Dsl project.

Next, we will use System.ComponentModel.Design.CollectionEditor class, so we need to add a reference System.Design to our Dsl and DslPackage projects.

So, we can create custom editor for our Property in Domain Class. We have to create editor class in custom code part in our Dsl project.
We can do that using below code:

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);
    }
}

Now, we should add our custom type in Dsl project. We can do that by clicking the left mouse button in DSL Explorer on the root of tree and select “Add New External Type”.

Next we have to fill in Name as “List” and Namespace as “System.Collections.Generic”. So we have new type as generic list of objects of our custom class NameType.

After that, we have to only define new Property in our DomainClass (e.g. in DslDefinition Designer by clicking the right mouse button on Domain Class and choose Add->DomainProperty)

In Properties we have to define Name as e.g NameTypeList, choose Type as List, choose Kind as CustomStorage and set Custom Attributes like System.ComponentModel.Editor {typeof(NameTypeEditor), typeof(System.Drawing.Design.UITypeEditor)}

In the end we have to define methods for CustomStorage for our property NameTypeList that we choose in our DomainClass.

We can do that by creating partial class of this Domain Class and write GetNameTypeListValue and SetNameTypeListValue methods.

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;
    }
}

Now we have Collection Property NameTypeList and we can edit our list of NameType values in easy way.

Transform all, build and run it.

I solved this problem in this way. I hope this advice will help you.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文