DSL工具NameAndType动态列表

时间:2011-05-05 08:32:14

标签: c# dsl dsl-tools

我对DSL类形状属性有疑问。

我创建了一种DSL工具。我希望在类图中有一些功能。

我的模型中有形状。我有带有隔间部分的Class Shape,用于属性和操作。 在模型中,我有属性类和操作类。

我为书中的atributtes创建了“NameAndType”,“Name”和“Type”属性 “使用Visual Studio DSL工具进行特定领域开发。 史蒂夫库克,加雷思琼斯,斯图尔特肯特,艾伦卡梅隆遗嘱“在404页面。

它工作得很好,但我希望在操作类中有参数的动态列表。某种集合属性。

现在我想为操作创建NameAndType Collections属性。我想在我的操作(方法)中选择要使用的参数数量。那必须是动态列表(一种集合)

你知道我该怎么办?

此致 亚当

1 个答案:

答案 0 :(得分:4)

我解决了我的问题。

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

以下是我的解决方案:

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

我创建的自定义类有两个字段(字符串_name,字符串_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项目中。

因此,我们可以为Domain Class中的Property创建自定义编辑器。我们必须在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中的鼠标左键并选择“添加新外部类型”来实现。

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

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

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

最后,我们必须为我们在DomainClass中选择的属性NameTypeList定义CustomStorage的方法。

我们可以通过创建此Domain Class的部分类并编写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值列表。

全部转换,构建并运行它。

我用这种方式解决了这个问题。我希望这个建议可以帮到你。

相关问题