2012-02-10 25 views
5

Vì vậy, nếu có một tài sản trong một class gọi Bar, tại sao tôi không thể truy cập enum tài sản hoặc static sở hữu bất kỳ type<T> trong tình huống này enum. Tôi đang tuyên bố hoàn toàn rằng <T> là của typeBar. Chỉ muốn biết liệu nó có đơn giản là giới hạn của Generics hay chính bản thân số enumtype.Bắt một Enum hoặc tĩnh tài sản từ Generic Loại Reference <T>

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 
    }; 
} 

CẬP NHẬT

Trong câu trả lời @Frederik Gheysels, nó đề cập rằng nếu tôi có một class mà chỉ đơn giản có nguồn gốc từ Bar rằng tôi sẽ không có quyền truy cập vào các enum hoặc bất kỳ static của số base. Điều đó là không chính xác, điều này biên dịch và hoạt động.

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

Tại sao bạn * muốn * để có thể thực hiện điều đó? Trường hợp sử dụng ở đây là gì? –

+0

Tương tự như http://stackoverflow.com/questions/196661/calling-a-static-method-on-a-generic-type-parameter – AlG

+0

Bạn đang cố gắng thực hiện điều gì đó tương tự như [this] (http: // stackoverflow .com/questions/4704201/what-is-the-best-way-to-ghi đè-enums)? –

Trả lời

1

Cars enum, là loại lồng nhau trong lớp Bar. Nó không phải là tài sản/phương pháp thành viên của Bar. Vì vậy, điều đó là không thể.

Ô tô chỉ là một loại thanh lồng nhau. Khi bạn tạo một lớp khác, có nguồn gốc từ Bar, hãy gọi nó là Bar2, bạn sẽ không có quyền truy cập vào Bar2.Cars không, vì loại đó sẽ không được tạo. Các kiểu lồng nhau không phải là các thành viên cá thể và do đó không được kế thừa.

+1

Điều này không hoàn toàn trả lời câu hỏi tại sao điều này là không thể. –

+4

Nó * là * một thành viên của Bar - một loại là một loại thành viên. –

+2

Có, nhưng cụ thể đối với Bar. Một kiểu Bar được kế thừa, sẽ được cho phép như một tham số chung cho T, sẽ không có kiểu .Cars. –

1

Giải pháp thay thế tiềm năng là cho phép Foo<T> kế thừa từ Bar để hiển thị các thành viên tĩnh. Để truy cập vào thành viên tĩnh Name, bạn cần cung cấp một người truy cập ảo là 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

Nhưng 'Foo' có thể không phải là 'Bar'. Nó rất có thể là không, nếu bạn xem xét bất kỳ loại bộ sưu tập generics. –

Các vấn đề liên quan