クラスがあります
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]
コメントを追加