2011-01-04 23 views
8

Ho la seguente classe genericaCasting una classe generica, senza specifico tipo

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

Ora, sto diventando un oggetto X, che so per certo è la patria:

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

Posso anche fare un cast senza specificare il tipo generico della classe?

risposta

9

Se sei sicuro che l'argomento DoSomething sarà un Home<T>, perché non renderlo un metodo generico?

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

Naturalmente, sarebbe ancora più facile se DoSomething dovrebbe logicamente essere un metodo di istanza su Home<T>.

Se davvero vuole attaccare con quello che hai, è possibile utilizzare la riflessione (non testata):

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

Hai provato cambiare la definizione del metodo per una cosa del genere?

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

} 
1

Come rendere la funzione generica?

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

Edit: Un altro possiblity sarebbe quello di creare un'interfaccia che detiene la proprietà GetClassName Così si avrebbe solo bisogno di controllare se è di tale interfaccia.

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

BTW: Vorrei utilizzare il nome completo qualificato

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

E se casa deriva da una classe di 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() } 
    } 
    ... 
} 

e poi

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