【问题标题】:Type inference on abstract class from inheriting concrete class从继承具体类对抽象类进行类型推断
【发布时间】:2019-06-08 14:39:26
【问题描述】:

我在这里要做的是从具体继承类的类型推断抽象类的类型 T。

例如,我有一个通用抽象类:

public abstract class MyAbstract<T> where T : class {
    //Methods...
}

还有一个继承MyAbstract的具体类:

public class MyConcrete : MyAbstract<MyConcrete> { 
    //Methods..
}

现在,我这工作得很好,但我发现这个抽象类很冗长,因为它总是继承类的类型。我知道可以对方法进行泛型类型推断(感谢 Jon Skeet http://joelabrahamsson.com/a-neat-little-type-inference-trick-with-c/),但我似乎无法为上述情况找到一种方法。

理想情况下,我应该有

//Type T on MyAbstract is inferred to be MyConcrete.
public class MyConcrete : MyAbstract {
    //Methods...
}

我想要的可能吗?

【问题讨论】:

  • 不,这是不可能的。你想达到什么目的?
  • @JacquesB 我的抽象类包含用于实例化ILoggers 的通用逻辑。创建记录器的一部分是根据记录器正在记录的类来命名记录器。因此,我在创建logger时使用typeof(T).Name获取继承类的名称。
  • 您需要为此使用继承吗?如果只是在方法中创建记录器,则可以提供this 作为参数。
  • @JacquesB 很高兴我在这里发帖!好主意,这绝对解决了我的问题,这对我来说是 COUUUURSE 时刻之一。再次感谢:)
  • 您不需要为此使用dynamic 或反射。您将方法定义为 GetLogger&lt;T&gt;(T subclass) 之类的东西,并从子类中将其称为 GetLogger(this)

标签: c# generics inheritance abstract type-inference


【解决方案1】:

我的问题在 cmets 中得到了解决。对于那些正在寻找的人来说,这是不可能的。

但是,我只需要基类中子类的类型信息,所以我最终在基类方法中实现了类型推断。

我的代码最终看起来像这样

public abstract class MyAbstract {
    DoSomething<T>(T caller){
        //foo
    }
}

具体来说:

public class MyConcrete : MyAbstract {
    base.DoSomething(this);
}

感谢 JacquesB 帮助我。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-02
    • 1970-01-01
    相关资源
    最近更新 更多