Comment puis-je affecté le type d'un objet à une méthode générique .NET?

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

  •  23-09-2019
  •  | 
  •  

Question

Supposons que j'ai créé une méthode comme ceci

private void Test<t>(t str)
{

}

d'une autre méthode que je l'appelle

private void BtnClick()
{
    string a = "";


    test<Here I Want To assign The Type what ever the type of 'a' is>();
}

Comment puis-je faire?

Pas de solution correcte

Autres conseils

Eh bien, si a est une chaîne, vous pouvez écrire:

Test<string>(a);

Et si a est un int, vous pouvez écrire:

Test<int>(a);

Assez évident. Si vous ne connaissez pas le type de a dès le départ, cela signifie que BtnClick doit être générique, le problème serait déplacé à l'appelant de BtnClick:

private void BtnClick<T>()
{
    T a = ...;


    Test<T>(a);
}

C # 2.0 et offre plus tard l'inférence de type, de sorte que vous ne devez spécifier le type:

Test(a);

Vous appelez simplement le a de passage de la fonction comme paramètre. L'inférence de type déterminera ce T devrait être pour 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 serait imprimé à la console.

Modifier Mais, oui, inférence de type absent, et quand vous savez ce que votre type de votre variable, vous pouvez toujours être explicite avec le type. Test<string>(temp);

Dans votre exemple, a est toujours un string, de sorte que vous pouvez simplement utiliser soit Test<string>(a) ou Test(a). Toutefois, si vous voulez dire que vous avez une instance de Type traîner quelque part, vous entrez dans la zone de réflexion. Notez que cela fonctionne, mais est lente si elle est utilisée dans une boucle serrée, alors assurez-vous que vous comprenez l'aspect performance;

        object arg = ...;
        MethodInfo method = typeof(YourType)
            .GetMethod("Test", BindingFlags.NonPublic | BindingFlags.Instance)
            .MakeGenericMethod(arg.GetType());
        method.Invoke(this, new object[] { arg });
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top