我对DSL类形状属性有疑问。
我创建了一种DSL工具。我希望在类图中有一些功能。
我的模型中有形状。我有带有隔间部分的Class Shape,用于属性和操作。 在模型中,我有属性类和操作类。
我为书中的atributtes创建了“NameAndType”,“Name”和“Type”属性 “使用Visual Studio DSL工具进行特定领域开发。 史蒂夫库克,加雷思琼斯,斯图尔特肯特,艾伦卡梅隆遗嘱“在404页面。
它工作得很好,但我希望在操作类中有参数的动态列表。某种集合属性。
现在我想为操作创建NameAndType Collections属性。我想在我的操作(方法)中选择要使用的参数数量。那必须是动态列表(一种集合)
你知道我该怎么办?
此致 亚当
答案 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值列表。
全部转换,构建并运行它。
我用这种方式解决了这个问题。我希望这个建议可以帮到你。