0

DSL クラスの Shape プロパティについて質問があります。

一種の DSL ツールを作成します。クラス図のような機能を少し持ちたいです。

モデルに形状があります。属性と操作用のコンパートメント部分を持つクラス シェイプがあります。モデルには、属性クラスと操作クラスがあります。

本の「Visual Studio DSL ツールを使用したドメイン固有の開発。Steve Cook、Gareth Jones、Stuart Kent、Alan Cameron Wills」の 404 ページのように、属性の「NameAndType」、「Name」、および「Type」プロパティを作成しました。

それはうまく機能しますが、操作クラスのパラメーターの動的リストが必要です。ある種の Collections プロパティ。

ここで、操作用の NameAndType Collections プロパティを作成したいと思います。操作 (メソッド) で使用するパラメーターの数を選択したいと考えています。それは動的リスト(一種のコレクション)でなければなりません

どうすればこれができるか知っていますか?

よろしくアダム

4

1 に答える 1

4

問題を解決します。

私はこのフォーラムにこれを書き留めます。他の人にも役立つかもしれないと思います。

以下は私の解決策です:

そのため、ドメインクラスのプロパティ(NameTypeListなど)のような独自のコレクションエディタを作成したいと思いました。

私はカスタムクラスwitchを作成しました。2つのフィールド(string _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でマウスの左ボタンをクリックし、[新しい外部タイプの追加]を選択します。

次に、Nameを「List」、名前空間を「System.Collections.Generic」と入力する必要があります。したがって、カスタムクラスNameTypeのオブジェクトのジェネリックリストとして新しいタイプがあります。

その後、DomainClassで新しいプロパティを定義するだけで済みます(たとえば、DslDefinition Designerで、ドメインクラス上でマウスの右ボタンをクリックし、[追加]-> [DomainProperty]を選択します)。

プロパティで、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値のリストを簡単に編集できます。

すべてを変換し、ビルドして実行します。

私はこの方法でこの問題を解決しました。このアドバイスがお役に立てば幸いです。

于 2011-05-08T19:51:00.843 に答える