(. Merci à tous pour les réponses, here is my refactored example, à son tour, une autre question StackOverflow sur le principe de responsabilité unique)Quels sont les avantages de l'utilisation de génériques dans les signatures de méthodes?
En venant de PHP en C#, cette syntaxe intimidait:
container.RegisterType<Customer>("customer1");
jusqu'à ce que je compris il exprime la même chose que:
container.RegisterType(typeof(Customer), "customer1");
comme je le démontre dans le code ci-dessous.
Alors est-il une raison pour laquelle les médicaments génériques est utilisé ici (par exemple à travers l'unité et la plupart des conteneurs C# IoC) autre que étant juste une syntaxe plus propre, à savoir que vous n'avez pas besoin typeof() lors de l'envoi du type?
using System;
namespace TestGenericParameter
{
class Program
{
static void Main(string[] args)
{
Container container = new Container();
container.RegisterType<Customer>("test");
container.RegisterType(typeof(Customer), "test");
Console.ReadLine();
}
}
public class Container
{
public void RegisterType<T>(string dummy)
{
Console.WriteLine("Type={0}, dummy={1}, name of class={2}", typeof(T), dummy, typeof(T).Name);
}
public void RegisterType(Type T, string dummy)
{
Console.WriteLine("Type={0}, dummy={1}, name of class={2}", T, dummy, T.Name);
}
}
public class Customer {}
}
//OUTPUT:
//Type=TestGenericParameter.Customer, dummy=test, name of class=Customer
//Type=TestGenericParameter.Customer, dummy=test, name of class=Customer
cela semble très utile, mais en essayant de l'implémenter, la ligne "T obj = new T();" me donne "Impossible de créer une instance du type de variable 'T' car elle n'a pas la nouvelle contrainte()". Qu'est-ce que je rate? –
Vous devez ajouter une contrainte comme dans ma réponse: 'public T CreateNew() où T: new()' –