誰かがこれを行うためのよりスマートな方法を持っていますか? これより簡単なはずですが、メンタルブロックがあります。基本的に、辞書からアイテムを削除し、辞書でもあるアイテムの値に再帰する必要があります。
private void RemoveNotPermittedItems(ActionDictionary menu)
{
var keysToRemove = new List<string>();
foreach (var item in menu)
{
if (!GetIsPermitted(item.Value.Call))
{
keysToRemove.Add(item.Key);
}
else if (item.Value is ActionDictionary)
{
RemoveNotPermittedItems((ActionDictionary)item.Value);
if (((ActionDictionary)item.Value).Count == 0)
{
keysToRemove.Add(item.Key);
}
}
}
foreach (var key in (from item in menu where keysToRemove.Contains(item.Key) select item.Key).ToArray())
{
menu.Remove(key);
}
}
アクション辞書は次のようになります。
public class ActionDictionary : Dictionary<string, IActionItem>, IActionItem