私は同様の質問に対する他の回答を見直しましたが、私が欲しいものを正確に見つけることはできません。私は2つのサブクラスのいずれかのインスタンスを格納できるSuperclass型の辞書を持っています。サブクラスの1つのメンバーにアクセスできる必要があります。私はそれにアクセスするためにサブクラスにLINQクエリでキャストする方法を把握することができません。ここに私が持っているものがあります。LINQクエリ内のサブタイプにキャスト
class VirtualFabric
{ Dictionary<string, SANSwitch} MemberSwitches = new Dictionary<string, SANSwitch>();
class SANSwitch
{
string SwitchWWN {get; set; }
Dictionary<int, VirtualFabric> VirtualFabrics = new Dictionary<int, VirtualFabric>();
}
class CiscoSwitch : SanSwitch {}
class BrocadeSwitch : SanSwitch
{
public Dictionary<int, string> VirtualWWNList = new Dictionary<int, string>();
public bool HasWWN(string wwn)
{
if (wwn.StartsWith("55")) { return this.VirtualWWNList.Values.Contains(wwn); }
else { return this.SwitchWWPN.Contains(wwn); }
}
}
したがって、VirtualFabricのMemberSwitchesは、CiscoSwitchまたはBrocadeSwitchのインスタンスを保存できます。私はこれをやろうとしている:HasWWNは()SANSwitch BrocadeSwitchにしていない定義されているため
List<SwitchPort> isls = this.ISLs.SelectMany(p => p.Value.Where(i => i is FCPort)).ToList();
// set up the ISLs
// if the remote switch port list already contains a port, then that switch log has been processed
// so do nothing
foreach (SwitchPort p in isls)
{
var bs = this.VirtualFabricList.SelectMany(t => t.Value.MemberSwitches.Values.Where
(s => s.Value.HasWWN(p.RemoteSwitchWWPN)));
// do something with any results
} // foreach
SelectManyがコンパイルされていません。私はそれをSANSwitchに移すことができるが、したくない。また、BrocadeタイプのMemberSwitches内のすべてのスイッチを取得したり、繰り返してBrocadeとして宣言してからそのリストを検索したりすることもできますが、LINQステートメントでキャストする方法があるかどうかは疑問です。私は特定のタイプのSelectの例を見ましたが、それは私が望むものではありません。ここで
あなたが1つのクラスをキャストできるならば、あなたは私が知っている新しいリスト –
にすべてをキャストするために 'Select'を使うことができます。私はそれを避け、おそらく何かを学ぶことを望んでいました。 –
[Enumerable.OfTypeメソッド(IEnumerable)](https://msdn.microsoft.com/en-us/library/bb360913) –
Slai