首页 > 解决方案 > C#:如何从包含抽象类的 IReadOnlyList 中获取派生类的值

问题描述

嗨,我怎样才能返回第一个 ValueNode 的值 + 第一个 ListNode 中第一个值的值?

Node 是父抽象类。

ListNode 是包含 ValueNode 列表的派生类。

ValueNode 是包含该值的派生类。

public static readonly IReadOnlyList<Node> TestData = new List<Node>
        {
            new ValueNode {Value = "a"},
            new ListNode
            {
                Values = new List<Node>
                {
                    new ValueNode {Value = "b"},
                    new ValueNode {Value = "c"},
                    new ListNode
                    {
                        Values = new List<Node>
                        {
                            new ValueNode {Value = "d"},
                            new ValueNode {Value = "e"}
                        }
                    },
                    new ListNode
                    {
                        Values = new List<Node>
                        {
                            new ValueNode {Value = "f"}
                        }
                    },
                    new ValueNode {Value = "g"}
                }
            },
            new ValueNode {Value = "h"},
            new ValueNode {Value = "i"},
            new ListNode
            {
                Values = new List<Node>
                {
                    new ValueNode {Value = "j"},
                    new ValueNode {Value = "k"}
                }
            },
        };
        public abstract class Node
        {
            protected object Data;
        }
        public class ValueNode : Node
        {
            public string Value
            {
                get => (string)Data;
                set => Data = value;
            }
        }
        public class ListNode : Node
        {
            public List<Node> Values
            {
                get => (List<Node>)Data;
                set => Data = value;
            }
        }
    }
}

我想知道如何从 TestData 返回值“a”和“b”值。

标签: c#

解决方案


您可以使用linq表达式来过滤具有给定类型的元素

IReadOnlyList<Node> testData = new List<Node> { new ValueNode(), new ListNode() };
var valuesOnly = testData.OfType<ValueNode>().ToArray();

这相当于:

var valuesOnly = testData.Where(x => x is ValueNode).ToArray();

推荐阅读