2012-02-10 51 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

相關問題