【问题标题】:How to inherit from a list of generic objects如何从通用对象列表继承
【发布时间】:2013-04-09 15:42:45
【问题描述】:

我收到错误使用泛型类型 GetOption<EnumT> 需要 1 个类型参数。错误来自我从List<GetOption>继承的第一行

我正在尝试建立一个继承结构,我可以在其中对基础对象进行所有处理,并将细节保存在子对象中。子对象的数量为 N。基础对象需要在实例化时被告知子类型。

最父类将从 List 继承,因此我可以在最父对象中拥有列表的功能,用于添加将在实例化时通知其类型的通用子级。

这是我目前所拥有的:

前两个类是基类

public abstract class GetOptions : List<GetOption>
{
    public enum FilterDirections
    {
        Ascending,
        Descending
    }

    private FilterDirections _filterDirection;

    public FilterDirections FilterDirection
    {
        get { return _filterDirection; }
        set { _filterDirection = value; }
    }

    public GetOptions()
    {
        FilterDirection = FilterDirections.Ascending;
    }
}

public abstract class GetOption<EnumT>
{
    private EnumT _column;

    public EnumT Column
    {
        get { return _column; }
        set { _column = value; }
    }

    public GetOption()
    {

    }
}

最后两个类是示例子类

public class PersonTypeLookupGetOptions : GetOptions
{
    public PersonTypeLookupGetOptions() : base() { }
}

public class PersonTypeLookupGetOption : GetOption<PersonTypeLookup.PersonTypeLookupFields>
{

}

我将如何完成我想做的事情?

编辑:

我要做的是在我从子对象中继承的列表中定义对象的类型。

根据我第一个问题下的评论,我能够找到我需要的解决方案。类定义如下:

public abstract class GetOptions<ChildT, EnumT> : List<ChildT> where ChildT : GetOption<EnumT>

public abstract class GetOption<EnumT>

public class PersonTypeLookupGetOptions : GetOptions<PersonTypeLookupGetOption, PersonTypeLookup.PersonTypeLookupFields>

public class PersonTypeLookupGetOption : GetOption<PersonTypeLookup.PersonTypeLookupFields>

【问题讨论】:

  • public abstract class GetOptions&lt;EnumT&gt; : List&lt;GetOption&lt;EnumT&gt;&gt;

标签: c# generics inheritance


【解决方案1】:

目前尚不清楚您要做什么,但可能对您有所帮助的一件事是将泛型参数传播到集合类型:

public abstract class GetOptions<EnumT> : List<GetOption<EnumT>>

最父类将从 List 继承,因此我可以在最父对象中使用列表的功能来添加将在运行时通知其类型的通用子级

请注意,泛型是在编译时绑定的,而不是在运行时绑定的。

【讨论】:

    【解决方案2】:

    虽然我不知道您的更大问题的解决方案,但我相当确定您的错误是由于您使用List&lt;GetOption&gt; 而编译器期望List&lt;GetOption&lt;EnumT&gt;&gt;。话虽这么说,我真的不明白你在这里要做什么......

    编辑:您似乎只是希望GetOption 成为没有&lt;EnumT&gt; 部分的类,然后您想从List&lt;GetOption&gt; 继承。因此,将基类更改为 GetOption 而不是 GetOption&lt;EnumT&gt; 可能会解决您的问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-26
      • 1970-01-01
      • 2019-11-03
      相关资源
      最近更新 更多