2012-02-10 22 views
5

所以,如果有一个名为classBar,为什么我不能访问enum财产或在这种情况下的type<T>任何static财产enum属性。我隐含声明<T>typeBar。只是想知道它是否仅仅是泛型的限制或其本身。从通用引用类型获取一个枚举或静态属性<T>

​​

修订

@Frederik Gheysels的答案,它提到,如果我有一个简单地从Bar获得的class,我不会有机会获得enum或任何staticbase。这是不正确的,这编译和工作。

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 
    } 
} 
+4

你为什么要*能够做到这一点?这里的用例是什么? – 2012-02-10 16:03:38

+0

类似于http://stackoverflow.com/questions/196661/calling-a-static-method-on-a-generic-type-parameter – AlG 2012-02-10 16:03:40

+0

你是否试图完成类似于[this](http:// stackoverflow .COM /问题/ 4704201 /什么,是最最好的方式对覆盖-枚举)? – 2012-02-10 16:05:53

回答

1

Cars枚举,里面Bar类嵌套类型。它不是Bar的成员财产/方法。 因此,这是不可能的。

汽车只是一个嵌套式的酒吧。当您创建另一个来自Bar的课程时,我们将其称为Bar2,因为您不会创建该类型,所以您也不会访问Bar2.Cars。嵌套类型不是实例成员,因此不会被继承。

+1

这并不完全回答为什么这是不可能的。 – 2012-02-10 16:02:04

+4

它*是* Bar的成员 - 类型是一种成员。 – 2012-02-10 16:02:41

+2

是的,但特定于酒吧。继承的Bar类型将被允许作为T的Generic参数,不会有 .Cars类型。 – 2012-02-10 16:06:50

1

潜在的解决方法是允许Foo<T>继承自Bar以公开静态成员。要访问静态成员Name,您需要提供一个虚拟访问器,如discussed here

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

     // use base class for enum accessor ? 
     var car2 = Foo<T>.Cars.Toyota; 
     var name2 = Foo<T>.Name; 

     default(T).Accessor = "test"; // static member access 
    } 
} 

public class Bar 
{ 
    public static string Name { get; set; } 
    public enum Cars { Honda, Toyota }; 
    public virtual string Accessor 
    { 
     get { return Name; } 
     set { Name = value; } 
    } 
} 
+0

但'Foo'可能不是'Bar'。如果您考虑任何集合类型泛型,最有可能不是。 – 2012-02-10 22:15:35

相关问题