在静态通用方法中获取当前类型?

时间:2010-01-24 01:11:58

标签: c# generics

我有一个像这样的抽象类;

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类中获得所需的信息。)

3 个答案:

答案 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
        }
    }