Génériques C # – possible de créer une méthode avec n types génériques ..?

Je ne pense pas que ce soit possible, mais voilà …

Je veux append une méthode qui peut gérer n nombre de génériques. par exemple :

bool MyMethod() where T: Isomething { } 

travaillera pour un type

 bool MyMethod() where T: Isomething { } 

travaillera pour deux types

Est-il possible de travailler avec n types – par exemple

 bool MyMethod() where T: Isomething { } 

La raison pour laquelle je veux faire cela est d’implémenter une méthode d’assistance statique nhibernate qui peut être chargée à partir de plusieurs assemblys – pour le moment, cela fonctionne très bien pour un assemblage. Ma méthode actuelle est la suivante:

  public static ISessionFactory GetMySqlSessionFactory(ssortingng connectionSsortingng, bool BuildSchema) { //configuring is meant to be costly so just do it once for each db and store statically if (!AllFactories.ContainsKey(connectionSsortingng)) { var configuration = Fluently.Configure() .Database(MySQLConfiguration.Standard .ConnectionSsortingng(connectionSsortingng) .ShowSql() //for development/debug only.. .UseOuterJoin() .QuerySubstitutions("true 1, false 0, yes 'Y', no 'N'")) .Mappings(m => { m.FluentMappings.AddFromAssemblyOf(); m.AutoMappings.Add(AutoMap.AssemblyOf().Conventions.Add); }) .ExposeConfiguration(cfg => { new SchemaExport(cfg) .Create(BuildSchema, BuildSchema); }); AllFactories[connectionSsortingng] = configuration.BuildSessionFactory(); } return AllFactories[connectionSsortingng]; } 

Où la ligne: m.FluentMappings.AddFromAssemblyOf (), je voudrais append plusieurs types, par exemple

 foreach(T in T[]){ m.FluentMappings.AddFromAssemblyOf() 

}

Évidemment, cela ne pourrait pas fonctionner. Je ne suis pas complètement idiot, mais je ne suis pas très fan des génériques – quelqu’un peut-il confirmer que cela n’est pas possible 🙂 ..? Quel serait le moyen le plus élégant d’atteindre cet effet à votre avis?

Non – l’arité des types et méthodes génériques est fixée par type / méthode.

C’est pourquoi il existe tous les différents types Action<...> , Func<...> et Tuple<...> dans la structure.

Parfois, c’est dommage, mais cela gêne relativement rarement, et je suppose que toutes sortes de choses seraient beaucoup plus compliquées avec une arité variable.

vous semblez répéter la même erreur que Newton a peut-être déjà commise. Il a deux chats l’un était plus grand et l’autre était plus petit. Il a fait deux trous dans la porte, un plus grand pour le plus grand et un plus petit pour le plus petit chat. Là où, en réalité, il avait besoin d’un grand trou pour aider le chat.

Pourquoi ne créez-vous pas une seule méthode pouvant traiter autant de types que vous le souhaitez?

 bool MyMethod() where T: Isomething { } 

En fait, je viens de remarquer ce lien – je dois rentrer à la maison maintenant, mais je pourrais essayer quelque chose comme ça plus tard si cela fonctionne:

http://geekswithblogs.net/marcel/archive/2007/03/24/109722.aspx

Je pense que si je passais dans un tableau de types et que je parcourais les types avec reflection, cela fonctionnerait.

Comme d’autres l’ont précisé, vous ne pouvez pas faire:

 bool MyMethod() where T: ISomething 

mais vous POUVEZ faire:

 bool MyMethod(params T[] somethings) where T : ISomething 

Par exemple:

 public interface ISomething { ssortingng Name { get; set; } } public class SomethingA : ISomething { public ssortingng Name { get; set; } = nameof(SomethingA); } public class SomethingB : ISomething { public ssortingng Name { get; set; } = nameof(SomethingB); } void MyMethod(params T[] somethings) where T : ISomething { foreach (var something in somethings) { if (something != null) Console.WriteLine(something); } } // Use it! ISomething a = new SomethingA(); ISomething b = new SomethingB(); // You don't need to specify the type in this call since it can determine it itself. MyMethod(a, b); // If calling it like this though you do: MyMethod(new SomethingA(), new SomethingB()); 

Sortie de la fenêtre interactive C #:

 > MyMethod(a, b); Submission#0+SomethingA Submission#0+SomethingB > > MyMethod(new SomethingA(), new SomethingB()); Submission#0+SomethingA Submission#0+SomethingB 

Ainsi, vous pouvez prendre les types que vous souhaitez (conformes au générique), les parcourir et appeler votre code comme vous l’avez spécifié. Vous pouvez également NE PAS utiliser de génériques et simplement prendre dans params object [] somethings; mais je vous recommande fortement de le taper si vous le pouvez.

Si quelqu’un voit cela, faites-le-moi savoir si je me trompe ou si je comprends mal la question … Merci!