2012-02-10 15 views
5

Así que si hay una enum propiedad en una llamada classBar, ¿por qué no puedo acceder a la propiedad o cualquier enumstatic propiedad de type<T> en esta situación. Estoy implícitamente declarando que <T> es de typeBar. Solo quería saber si es simplemente una limitación de Generics o el enumtype.contraer una enumeración o Propiedad estática de Genérico Tipo de referencia <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 
    }; 
} 

ACTUALIZADO

En respuesta de @Frederik Gheysels, se menciona que si tengo un class que se deriva simplemente de Bar que no iba a tener acceso a la enum o cualquier static de el base. Eso no es correcto, esto compila y funciona.

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

¿Por qué querrías * poder * poder hacer eso? ¿Cuál es el caso de uso aquí? –

+0

Similar a http://stackoverflow.com/questions/196661/calling-a-static-method-on-a-generic-type-parameter – AlG

+0

¿Está tratando de lograr algo similar a [esto] (http: // stackoverflow .com/questions/4704201/what-is-the-best-way-to-override-enums)? –

Respuesta

1

su Cars enumeración, es un tipo anidado dentro de la clase Bar. No es una propiedad/método miembro de Bar. Por lo tanto, no es posible.

Cars es simplemente un tipo anidado de Bar. Cuando crea otra clase, que deriva de Bar, vamos a llamarlo Bar2, tampoco tendrá acceso a Bar2.Cars, ya que no se creará ese tipo. Los tipos anidados no son miembros de la instancia y, por lo tanto, no se heredan.

+1

Esto no responde completamente a la pregunta de por qué esto no es posible. –

+4

It * is * member of Bar - un tipo es un tipo de miembro. –

+2

Sí, pero específico para Bar. Un tipo heredado de barra, que se permitirá como un parámetro genérico para T, no tendrá un tipo .Cars. –

1

Una posible solución es permitir que Foo<T> herede de Bar para exponer los miembros estáticos. Para acceder al miembro estático Name, debe proporcionar un descriptor de acceso virtual como 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

Pero 'Foo' puede no ser un' Bar'. Lo más probable es que no lo sea, si considera cualquier tipo de colección genérica. –

Cuestiones relacionadas