将当前对象类型传递给基础构造函数调用

Cod*_*uth 9 c# inheritance constructor types

我如何抓取Type继承的类并将其传递给继承的类的基础构造函数?请参阅下面的代码示例:

// VeryBaseClass is in an external assembly
public abstract class VeryBaseClass
{
    public VeryBaseClass(string className, MyObject myObject)
    {

    }
}

// BaseClass and InheritedClass are in my assembly
public abstract class BaseClass : VeryBaseClass
{
    public BaseClass(MyObject myObject) :
        base(this.GetType().Name, myObject) // can't reference "this" (Type expected)
    {

    }
}

public class InheritedClass : BaseClass
{
    public InheritedClass(MyObject myObject)
    {

    }
}
Run Code Online (Sandbox Code Playgroud)

该行base(typeof(this).Name, myObject)不起作用,因为我还无法引用this,因为该对象尚未完成构造,因此不存在.

是否有可能抓住Type当前构建的对象?

编辑:

将样本更正为orsogufo建议,但仍然不起作用,因为this未定义.

编辑2:

只是为了澄清,我想最终"InheritedClass"被传递给VeryBaseClass(string className, MyObject myObject)构造函数.

Tho*_*mas 18

啊哈!我找到了解决方案.你可以用泛型来做到这一点:

public abstract class VeryBaseClass
{
    public VeryBaseClass(string className, MyObject myObject)
    {
        this.ClassName = className;
    }

    public string ClassName{ get; set; }
}
public abstract class BaseClass<T> : VeryBaseClass
{
    public BaseClass(MyObject myObject)
        : base(typeof(T).Name, myObject)
    {
    }
}

public class InheritedClass : BaseClass<InheritedClass>
{
    public InheritedClass(MyObject myObject) 
        : base(myObject)
    {

    }
}
Run Code Online (Sandbox Code Playgroud)

  • 突然,出现了CRTP(又名奇怪的重复模板模式)!:)(参见https://en.wikipedia.org/wiki/Curiously_recurring_template_pattern) (3认同)

Jon*_*eet 6

我之前在Google Wave Robot .NET API中遇到了同样的痛苦,我想让构造函数根据属性传递一些值.您可以在代码中查看我的解决方案,以获取派生类型基本类型.基本上我将一个委托传递给基础构造函数,然后调用该委托将"this"传递给委托.所以在你的情况下,你有:

public VeryBaseClass(Func<VeryBaseClass, string> classNameProvider)
{
    this.name = classNameProvider(this);
}
Run Code Online (Sandbox Code Playgroud)

public BaseClass() : base(FindClassName)
{
}

private static string FindClassName(VeryBaseClass @this)
{
    return @this.GetType().Name;
}
Run Code Online (Sandbox Code Playgroud)

这真的很丑,但它确实有效.

编辑:这种方法只有在你可以改变你的基类构造函数时才有效; 如果你不能,我不确定它实际上是否可行:(