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)
我之前在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)
这真的很丑,但它确实有效.
编辑:这种方法只有在你可以改变你的基类构造函数时才有效; 如果你不能,我不确定它实际上是否可行:(
| 归档时间: |
|
| 查看次数: |
11301 次 |
| 最近记录: |