Come faccio assegnato il tipo di qualsiasi oggetto a un metodo generico .NET?
Domanda
Supponiamo che ho creato un metodo come questo
private void Test<t>(t str)
{
}
Ora da un altro metodo che chiamo
private void BtnClick()
{
string a = "";
test<Here I Want To assign The Type what ever the type of 'a' is>();
}
Come posso fare questo?
Nessuna soluzione corretta
Altri suggerimenti
Bene, se a
è una stringa, è possibile scrivere:
Test<string>(a);
E se a
è un int
, è possibile scrivere:
Test<int>(a);
abbastanza evidente. Se non si conosce il tipo di a
in anticipo, il che significa che BtnClick
dovrebbe essere generica, il problema sarebbe stato spostato al chiamante di BtnClick
:
private void BtnClick<T>()
{
T a = ...;
Test<T>(a);
}
C # 2.0 e versioni successive offre inferenza di tipo, quindi non sarebbe necessario specificare il tipo:
Test(a);
È sufficiente chiamare il a
funzione di passaggio come parametro. L'inferenza di tipo determinerà quello che T dovrebbe essere per a
.
static void Main()
{
string temp = "blah";
Test(temp);
Console.Read();
}
private static void Test<T>(T input)
{
Console.WriteLine(typeof(T).ToString());
}
System.String
verrebbe stampato sulla console.
Modifica Ma, sì, assente inferenza di tipo, e quando si sa che cosa il vostro tipo la variabile è, si può sempre essere esplicito con il tipo. Test<string>(temp);
Nel tuo esempio, a
è sempre un string
, in modo da poter semplicemente utilizzare sia Test<string>(a)
o Test(a)
. Se, invece, vuoi dire che si dispone di un'istanza Type
in giro da qualche parte, poi si arriva nella zona di riflessione. Si noti che questo funziona, ma è lento se usato in una stretta-loop, in modo da assicurarsi di aver compreso l'aspetto delle prestazioni;
object arg = ...;
MethodInfo method = typeof(YourType)
.GetMethod("Test", BindingFlags.NonPublic | BindingFlags.Instance)
.MakeGenericMethod(arg.GetType());
method.Invoke(this, new object[] { arg });