从通用引用类型<T>获取枚举或静态属性

Gab*_*abe 5 c# generics .net-4.0

因此,如果被叫中存在enum属性,为什么我无法访问该属性或此情况下的任何属性.我隐含地宣称那是.只是想知道它是否只是泛型或其本身的限制.classBarenumstatictype <T><T>type Barenum type

public class Foo<T> where T : Bar
{
     public Foo()
     {
         // This obviously works
         var car = Bar.Cars.Honda;
         var name = Bar.Name;  

         // Why can't I do this ?
         var car2 = T.Cars.Toyota;
         var name2 = T.Name;
     }
}

public class Bar
{
     public static string Name { get; set; }
     public enum Cars
     {
         Honda,
         Toyota
     };
}
Run Code Online (Sandbox Code Playgroud)

更新

@Frederik Gheysels的回答中,提到如果我有一个class简单的派生Bar,我将无法访问enum或任何static一个base.这是不正确的,这编译和工作.

public class Foo : Bar
{
    public Foo()
    {
        // This all works
        var address = this.Address;
        var car = Foo.Cars.Honda;
        var name = Foo.Name;
    }
}

public class Bar
{
    public static string Name { get; set; }
    public string Address { get; set; }
    public enum Cars
    {
        Honda,
        Toyota
    }
}
Run Code Online (Sandbox Code Playgroud)

Fre*_*els 1

您的Cars枚举是 class 内的嵌套类型Bar。它不是 的成员属性/方法Bar。因此,这是不可能的。

Cars 只是 Bar 的嵌套类型。当您创建另一个派生自 Bar 的类(我们称其为 )时Bar2,您将无法访问Bar2.Cars这两个类,因为不会创建该类型。嵌套类型不是实例成员,因此不会被继承。

  • 它*是* Bar 的成员 - 类型是一种成员。 (4认同)
  • 是的,但特定于 Bar。Bar 的继承类型(允许作为 T 的通用参数)不会具有 &lt;inheritedtype&gt;.Cars 类型。 (2认同)