【问题标题】:Subset of Generic Abstract List - C#通用抽象列表的子集 - C#
【发布时间】:2010-12-31 04:35:51
【问题描述】:

我正在制作一些抽象基类。基础对象定义为:

    public abstract class Bar
    {
        public bool Enabled;
    }

基础集合定义为:

 public abstract class Foo<T> : List<T>
        where T : Bar
    {
        public Foo<T> GetAllEnabled()
        {
            Foo<T> ret = new Foo<T>();

            foreach (T item in this)
            {
                if (item.Enabled)
                {
                    ret.Add(item);
                }
            }

            return ret;
        }
    }

当然,我在尝试创建 new Foo&lt;T&gt;() 时遇到错误,因为 Foo 是一个抽象类。没有 abstract 修饰符,一切正常,但我想要修饰符,因为我想确保类得到派生。

我试过了

     Type U = this.GetType();
        Foo ret = new U();
但我收到一个错误“找不到类型或命名空间名称'U'(等等等等)”。

我认为我尝试的修复应该有效,但我一定是语法错误。我在这里错过了什么?

【问题讨论】:

  • 看看Type.GetConstructorActivator.CreateInstance
  • 感谢 Eric 和 Anthony,这正是我所需要的。

标签: c# .net generics abstract-class


【解决方案1】:
Type U = this.GetType();
Foo ret = new U();

Type U 将包含有关数据类型的信息,它不等同于您可以实例化的泛型类型参数。您可以使用U 通过Activator.CreateInstance 创建一个类型,它有一些重载并接受Type 对象,但是您需要将生成的对象转换为适当的类型以便能够使用它。

Type type = this.GetType();
Foo<T> ret = (Foo<T>)Activator.CreateInstance(type);

【讨论】:

  • @Grasshopper @Anthony Activator.CreateInstance 能够创建抽象类的实例吗? msdn.microsoft.com/en-us/library/wccyzw83.aspx 的 MSDN 文档说,如果您尝试使用 CreateInstance(Type) 创建抽象类的实例,您将收到 MemberAccessException。或者我只是读错了。
  • @Waleed,它不是创建抽象类的实例,而是创建与 this 相同类型的实例并将其转换为 抽象类,仅此而已完全合法。 this 将是 DerivedFoo&lt;T&gt;(或其他)。
  • 感谢安东尼的解释。
【解决方案2】:
but I want the modifier there because I want to make sure the class gets derived.

按照您自己的说法,您需要派生一个可以实例化的类。

【讨论】:

  • 我想写一次这个功能,而不是在 6 个派生类中,我不想用派生的“Foo2”类来混淆我的代码 - 不需要 2 个基类相同事情。
【解决方案3】:

当然实例化抽象类Foo&lt;T&gt;是错误的。这是抽象的直接后果。

但我想要 [abstract] 修饰符,因为我想确保类得到派生。

然后先导出class Foo2&lt;T&gt; : Foo&lt;T&gt; { }再实例化Foo2&lt;T&gt;

【讨论】:

  • 我想写一次这个功能,而不是在 6 个派生类中,我不想用派生的“Foo2”类来混淆我的代码 - 不需要 2 个基类相同事情。
  • @Grassh:???我们没有看到全貌,但我建议您重新考虑一下您在这里所做的事情。如果这是为了测试,它可能没问题,但是在生产代码中实例化抽象类的任何方式(或需要)看起来都是一个严重的设计错误。
【解决方案4】:

你想创建什么类型?你到底想完成什么?你为什么强迫从你的集合类派生?如果你希望它的项目是抽象的,你不需要集合是抽象的。尤其是泛型。

还有:http://blogs.msdn.com/b/codeanalysis/archive/2006/04/27/585476.aspx(我认为有更好的文章,但我找不到)

【讨论】:

  • 我想创建一个派生类型的实例,从中调用该方法。我希望集合是抽象的,以强制下游开发人员从此类派生,而不是直接实例化它。
猜你喜欢
  • 2011-09-01
  • 2021-03-07
  • 2023-03-10
  • 1970-01-01
  • 2016-04-19
  • 2016-08-12
  • 1970-01-01
  • 2017-07-28
  • 1970-01-01
相关资源
最近更新 更多