2011-01-04 15 views
8

Tengo la siguiente clase genéricaLanzar una clase genérica y sin tipo específico

public class Home<T> where T : Class 
{ 
    public string GetClassType 
    { 
     get{ return T.ToString() } 
    } 
} 

Ahora, me estoy poniendo un objeto X que sé con certeza es el hogar:

public void DoSomething(object x) 
{ 
    if(x is // Check if Home<>) 
    { 
     // I want to invoke GetClassType method of x 
     // but I don't know his generic type 
     x as Home<?> // What should I use here? 
    } 
} 

es esto mero hacer un reparto sin especificar el tipo genérico de la clase?

Respuesta

9

Si está seguro de que el argumento DoSomething será , ¿por qué no convertirlo en un método genérico?

public void DoSomething<T>(Home<T> home) 
{ 
    ... 
} 

Por supuesto, sería aún más fácil si DoSomething debería lógicamente ser un método de instancia en Home<T>.

Si realmente quiere quedarse con lo que tiene, usted podría utilizar la reflexión (no probado):

public void DoSomething(object x) 
{ 
    // null checks here. 

    Type t = x.GetType(); 

    if (t.IsGenericType && 
      && t.GetGenericTypeDefinition() == typeof(Home<>)) 
    { 
     string result = (string) t.GetProperty("GetClassType") 
            .GetValue(x, null); 

     Console.WriteLine(result); 
    } 

    else 
    { 
     ... // do nothing/throw etc. 
    } 
} 
0

Ha intentado cambiar la definición de un método para algo como esto?

public void DoSomething<T>(Home<T> x) 
{ 

} 
1

¿Qué le parece hacer que la función sea genérica?

public void DoSomething<T>(object x) 
{ 
    if(x is Home<T>) 
    { 
     x as Home<T> ... 
    } 
} 

Editar: Otra posibilidad sería la creación de una interfaz que tiene la propiedad GetClassName por lo que sólo habría que comprobar si es de esa interfaz.

public interface IDescribeClass 
{ 
    public string GetClassName { get; set; } 
} 

BTW: Me gustaría utilizar el nombre calificado completo

public string ClassType 
{ 
    get{ return typeof(T).FullName; } 
} 
4

Inicio ¿Qué pasa si deriva de una clase base?

public class Home 
{ 
    public virtual string GetClassType { get; } 
} 
public class Home<T> : Home 
    where T : class 
{ 
    public override string GetClassType 
    { 
     get{ return T.ToString() } 
    } 
    ... 
} 

y luego

public void DoSomething(object x) 
{ 
    if(x is Home) 
    { 
     string ct = ((Home)x).GetClassType; 
     ... 
    } 
} 
Cuestiones relacionadas