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 BtnClickChamador:

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 });
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top