Come faccio assegnato il tipo di qualsiasi oggetto a un metodo generico .NET?

StackOverflow https://stackoverflow.com/questions/2543085

  •  23-09-2019
  •  | 
  •  

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 });
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top