Como atribuo o tipo de qualquer objeto a um método genérico .NET?
Pergunta
Suponha que eu criei um método como este
private void Test<t>(t str)
{
}
Agora, de outro método, eu o chamo
private void BtnClick()
{
string a = "";
test<Here I Want To assign The Type what ever the type of 'a' is>();
}
Como posso fazer isso ?
Nenhuma solução correta
Outras dicas
Bem, se a
é uma string, você pode escrever:
Test<string>(a);
E se a
é um int
, você pode escrever:
Test<int>(a);
Muito obvio. Se você não sabe o tipo de a
antecipadamente, isso significa que BtnClick
deve ser genérico, o problema seria movido para BtnClick
Chamador:
private void BtnClick<T>()
{
T a = ...;
Test<T>(a);
}
C# 2.0 e depois oferece inferência de tipo, para que você não precise especificar o tipo:
Test(a);
Você simplesmente chama a função que passa a
como o parâmetro. A inferência de tipo determinará para que deveria ser T para 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
seria impresso no console.
Editar: Mas, sim, a inferência de tipo ausente e, quando você sabe qual é a sua variável, você sempre pode ser explícito com o tipo. Test<string>(temp);
No seu exemplo, a
é sempre um string
, então você pode simplesmente usar qualquer um Test<string>(a)
ou Test(a)
.Se, no entanto, você quer dizer que tem um Type
por exemplo, andando em algum lugar, então você entra na área de reflexão.Observe que isso funciona, mas é lento se usado em um circuito fechado, portanto, certifique-se de compreender o aspecto do desempenho;
object arg = ...;
MethodInfo method = typeof(YourType)
.GetMethod("Test", BindingFlags.NonPublic | BindingFlags.Instance)
.MakeGenericMethod(arg.GetType());
method.Invoke(this, new object[] { arg });