我有一个像这样的抽象类;
public abstract PropertyBase
{
public static System.Type GetMyType()
{
return !!!SOME MAGIC HERE!!!
}
}
我想将它子类化,当我调用静态GetMyType()时,我想返回子类的类型。所以,如果我声明一个子类型;
public class ConcreteProperty: PropertyBase {}
然后我打电话
var typeName = ConcreteProperty.GetMyType().Name;
我希望'typeName'设置为“ConcreteProperty”。我怀疑没有办法做到这一点,但我很感兴趣,如果有人知道如何获得这些信息。
(我试图解决的特殊问题是WPF中依赖属性的冗长;我希望能够做到这样的事情;
class NamedObject : DependencyObject
{
// declare a name property as a type, not an instance.
private class NameProperty : PropertyBase<string, NamedObject> { }
// call static methods on the class to read the property
public string Name
{
get { return NameProperty.Get(this); }
set { NameProperty.Set(this, value); }
}
}
我几乎有一个实现,但我无法从NameProperty类中获得所需的信息。)
答案 0 :(得分:6)
您可以使用泛型部分实现(1级深度继承):
class PropertyBase<T>
{
public static Type GetMyType() { return typeof (T); }
}
// the base class is actually a generic specialized by the derived class type
class ConcreteProperty : PropertyBase<ConcreteProperty> { /* more code here */ }
// t == typeof(ConcreteProperty)
var t = ConcreteProperty.GetMyType();
答案 1 :(得分:4)
子类化位不起作用,因为静态方法与类型相关联。它是类型的方法,而不是实例的方法。子类型不包含基类型的静态方法,因为它们是不同的类型,静态方法与基类型相关联。即使编译器可能允许您通过派生类调用基类的静态方法,它实际上也会从基类调用该方法。这只是语法糖。出于同样的原因,你不能“覆盖”子类中的静态方法,因为它没有多大意义。
答案 2 :(得分:0)
只是想知道为什么需要做这样的事情?
var typeName = ConcreteProperty.GetMyType().Name;
无论如何你在调用方法时都知道类型,你也可以这样做..
var typeName = typeof(ConcreteProperty).Name;
如果您需要这样做,可以使用“shadowing”来覆盖子类中基类的实现。
public class ConcreteProperty : PropertyBase {
public new static Type GetMyType {
//provide a new implementation here
}
}