Comment puis-je affecté le type d'un objet à une méthode générique .NET?
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 });