C# - 泛型类列表

3

我有以下几个类:

public abstract class Section
{

}

public class Section<T> : Section where T : new()
{
    public string Type { get; set; }

    public bool IsFocused { get; set; }

    private T sectionData;

    public T SectionData 
    { 
        get => sectionData == null ? sectionData = new T() : sectionData; 
        set => sectionData = value; 
    }
}

public class SectionHeaderData
{
    public string Text { get; set; }

    public int Level { get; set; }
}

public class SectionParagraphData
{
    public string Text { get; set; }
}

然后我创建章节并将其存储在 List<> 中,如下所示:
Section<SectionHeaderData> sectionHeader = new Section<SectionHeaderData>();
sectionHeader.SectionData.Text = "This is Header.";
sectionHeader.SectionData.Level = 3;

Section<SectionParagraphData> sectionParagraph1 = new Section<SectionParagraphData>();
sectionParagraph1.IsFocused = true;
sectionParagraph1.SectionData.Text = "This is Paragraph 1.";

Section<SectionParagraphData> sectionParagraph2 = new Section<SectionParagraphData>();
sectionParagraph2.SectionData.Text = "This is Paragraph 2.";

List<Section> sections = new List<Section>();
sections.Add(sectionHeader);
sections.Add(sectionParagraph1);
sections.Add(sectionParagraph2);

我无法使用LINQ并通过 IsFocused == true 获取元素:

var focusedSection = sections.FirstOrDefault(x => x.IsFocused == true);

是否可以像普通的 List<SomeClass> 列表一样访问 SectionHeaderDataSectionParagraphData 成员?

编辑 1:

如建议所述,这里有更多关于我需要的信息。

在程序的某个时刻,将调用一个函数,在该函数中,我需要获取焦点部分,并能够访问 SectionHeaderDataSectionParagraphData 的更具体数据。

例如,我需要读取/设置 Text 属性的值。


6
你需要将TypeIsFocused移到非泛型的Section类中,这样就可以正常工作了。只有SectionData属性涉及到T,所以它是泛型类型中唯一需要保留的部分。 - Jon Skeet
1
使用.OfType<Section<SectionHeaderData>>()来过滤特定类型的对象。然后,您可以引用这些类型的属性。 - D Stanley
1
然后你需要将它转换为适当的类型。或者,如果您不需要强类型访问,则可以在“Section”中拥有一个abstract object SectionData { get; }属性。基本上,我们目前正在猜测您需要什么 - 请使用更多细节编辑问题。 - Jon Skeet
2
我猜想你想让SectionHeaderDataSectionParagraphData均继承自SectionData类,该类包含一个Text属性。然后你可以直接将其转换为SectionData(或在非泛型类中仅需将属性命名为SectionData并相应地限制T)。 - Jon Skeet
1
感谢@JonSkeet的帮助,我会采用“...同时继承自具有Text属性的SectionData类”的方法。谢谢! - imb13
显示剩余2条评论
1个回答

6

您需要将属性放入抽象类中:

public abstract class Section
{
    public string Type { get; set; }

    public bool IsFocused { get; set; }
}

例如,我需要读取/设置Text属性的值。 实际上,我想知道为什么你不将Text属性拉入基类并通过继承解决它(我会从Jon Skeet的评论中借用这个名称):
public class SectionData
{
    public string Text { get; set; }
}

public class SectionHeaderData : SectionData
{
    public int Level { get; set; }
}

public class SectionParagraphData: SectionData { }

那么你可以像这样访问这些字段:

var textSection = sections.OfType<SectionData>().ToList();
textSection[0].Text = "this compiles";

谢谢,那绝对有效。我还需要一点帮助。您能看一下我的更新问题吗? - imb13
1
@imb13,我编辑了我的答案,加入了你在编辑中提到的第二个问题。 - Mong Zhu
谢谢,我会尝试的。 - imb13

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接