C#「新しい」プロパティを使用して非表示のプロパティを設定する方法は?

ベンコフスキー

クラスがあります

public class MenuItem
{
    // This class have a lot of fixed properties that I can't change
    public string Foo { get; set; } 

    // Child items used to create a tree structure
    public IList<MenuItem> Items { get; set; }
}

そして今、私はそれから継承する新しいクラスを作成したいMenuItemと思います。それは私が必要とするより多くのデータを保持します。

public class MenuItemData<T> : MenuItem
{
    public T Data { get; set; }

    public new IList<MenuItemData<T>> Items { get; set; }
}

しかし、ツリー構造を実現するには、タイプをItems新しいものに「変更」する必要があるMenuItemData<T>ため、を使用しましたnew

しかし、問題は、このツリー構造にを入力MenuItemData<T>するIList<MenuItemData<T>> Items、値がに設定されるだけでIList<MenuItem> Items、ツリー構造の作成に使用される値は設定されないことです。

だから私Itemsはそれが機能するように両方を設定する必要があります...しかし私はそれを行う方法がわかりません。

私がやろうとしたのは、でツリー構造を設定してから、ツリーIList<MenuItemData<T>> Itemsをトラバースして非表示のプロパティを設定することですが、「新しい」プロパティを取得してその値を非表示のプロパティに設定する方法もわかりません(「 new "プロパティはhiddenプロパティを継承するため、値を一方から他方に設定できるはずです)。

次の点に注意してください。

  • MenuItemクラスを変更することはできません
  • なしの解決策があればnew、それも大丈夫です
  • 質問がわかりにくい場合は、お知らせください。ツリーをどのようにトラバースしているかについて、いくつか例を挙げます。
ヴェルヌー

隠しプロパティを持つタイプへのキャストで隠しプロパティにアクセスできます:

static void SetItems<T>(MenuItemData<T> menu, IList<MenuItemData<T>> items)
{
    menu.Items = items;
    ((MenuItem)menu).Items = items.Cast<MenuItem>().ToList();
}

また、キーワードbase使用して、派生クラスから非表示のプロパティにアクセスできます。さらに、クラスはMenuItemDataList<T>実装しIList<MenuItem>IList<MenuItemData<T>>

public class MenuItemData<T> : MenuItem
{
    public T Data { get; set; }
    public new IList<MenuItemData<T>> Items
    {
        get => (MenuItemDataList<T>)base.Items;
        set => base.Items = new MenuItemDataList<T>(value);
    }
}

public class MenuItemDataList<T> : List<MenuItemData<T>>, IList<MenuItem>
{
    public MenuItemDataList(IList<MenuItemData<T>> items) : base(items)
    {}

    MenuItem IList<MenuItem>.this[int index]
    {
        get => this[index];
        set => this[index] = (MenuItemData<T>)value;
    }
    bool ICollection<MenuItem>.IsReadOnly => false;
    void ICollection<MenuItem>.Add(MenuItem item) => Add((MenuItemData<T>)item);
    bool ICollection<MenuItem>.Contains(MenuItem item) => item is MenuItemData<T> data && Contains(data);
    void ICollection<MenuItem>.CopyTo(MenuItem[] array, int arrayIndex) => throw new NotImplementedException();
    IEnumerator<MenuItem> IEnumerable<MenuItem>.GetEnumerator() => GetEnumerator();
    int IList<MenuItem>.IndexOf(MenuItem item) => item is MenuItemData<T> data ? IndexOf((MenuItemData<T>)item) : -1;
    void IList<MenuItem>.Insert(int index, MenuItem item) => Insert(index, (MenuItemData<T>)item);
    bool ICollection<MenuItem>.Remove(MenuItem item) => Remove((MenuItemData<T>)item);
}

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

PowerShellを使用して既存のJsonプロパティに新しいJsonArrayプロパティを追加する方法

プロパティ展開を使用しているプロパティの実際の値を表示する方法

Groovyで新しいプロパティを設定してそのセッターを提供する方法

javascriptを使用して新しく追加されたセルのhtmlプロパティを設定する方法

C#文字列を使用して保存されたプロパティ設定に基づいてコンボボックスの値を設定する方法

Java Beanプロパティをエキスパートプロパティとして設定する方法は?

AngularJSで$ anchorScrollのyOffsetプロパティを設定して使用する方法

SeTプロパティを使用してC#でクラスの複数のプロパティを同時に設定する

変数をプロパティとして設定する方法

c#クラスで宣言されている方法でプロパティを設定します

C#での反映を使用してプロパティ値を取得する方法

C#での反映を使用してプロパティ値を取得する方法

「widthプロパティは非推奨です。styleを使用してダイアログの幅を定義してください。」を解決する方法。警告

タイプから名前でプロパティを取得し、C#のリフレクションを使用してプロパティ値を設定するにはどうすればよいですか?

App Engine Datastore:golangを使用してプロパティに複数の値を設定する方法は?

ezdxfを使用してプロパティの印刷設定をオフにする方法は?

WebSharperと相互作用してDOMプロパティを設定する方法は?

PHP:変数を使用して静的プロパティの値を設定する

文字列名のみを使用してプロパティを設定する

URLをantのプロパティに設定してantcontribHttpClientTaskを使用する

WSO2 ESB でプロパティの設定値を取得して使用する方法は?

!importantを使用して表示プロパティをインラインで設定する方法

ReactuseStateフックを使用して表示スタイルプロパティを設定する方法

新しい要素クラスのプロパティ値を設定します

SKLabelNodeの非表示プロパティをNOに設定しても機能しない

mongoDBアトラスの既存のレコードに新しいプロパティを設定する方法

プロパティのプロパティを設定する

ループを使用して実行時にプロパティ設定の現在の値を取得する方法

Application.yamlの別のプロパティに基づいてプロパティ名を設定する方法

TOP 一覧

  1. 1

    セレンのモデルダイアログからテキストを抽出するにはどうすればよいですか?

  2. 2

    CSSのみを使用して三角形のアニメーションを作成する方法

  3. 3

    ZScalerと証明書の問題により、Dockerを使用できません

  4. 4

    ドロップダウンリストで選択したアイテムのQComboBoxスタイル

  5. 5

    別のホストからTomcat Managerアプリにアクセスする

  6. 6

    PyCharmリモートインタープリターはプロジェクトタブにサイトパッケージのコンテンツを表示しません

  7. 7

    Windows 10でのUSB入力デバイスの挿入/取り外しの検出

  8. 8

    Python / SciPyのピーク検出アルゴリズム

  9. 9

    MLでのデータ前処理の背後にある直感

  10. 10

    useRefに反応してコンポーネントをスクロールして表示する

  11. 11

    モーダルダイアログを自動的に閉じる-サーバーコードが完了したら、Googleスプレッドシートのダイアログを閉じます

  12. 12

    パンダは異なる名前の列に追加します

  13. 13

    PictureBoxで画像のブレンドを無効にする

  14. 14

    Windows 10 Pro 1709を1803、1809、または1903に更新しますか?

  15. 15

    Pythonを使用して、リストからデータを読み取り、特定の値をElasticsearchにインデックス付けするにはどうすればよいですか?

  16. 16

    LinuxでPySide2(Qt for Python)をインストールするQt Designerはどこにありますか?

  17. 17

    Material-UIでTextFieldエラーの色を条件付きでオーバーライドする方法

  18. 18

    goormIDEは、ターミナルがロードするデフォルトプロジェクトを変更します

  19. 19

    MatplotlibまたはSeabornを使用して、グループ化されたデータから複数のプロットを生成するにはどうすればよいですか?

  20. 20

    Luaの文字列から特定の特殊文字を削除するにはどうすればよいですか?

  21. 21

    Flutterにファイルピッカープラグインを追加するにはどうすればよいですか?

ホットタグ

アーカイブ