J'ai une hiérarchie d'interfaces génériques, où chaque interface est liée à IOperator<T1,T2>
.Instancier toutes les classes qui implémentent une instance d'une interface générique
interface IOperator<T1, T2>
{
Func<T1, T2, bool> GetFunc()
}
IOperator : IOperator<object, object>
interface IMatchingOperator : IOperator<string, string> { }
interface IComparisonOperator<T1, T2> : IOperator<T1, T2>
where T1: IComparable<T2> { }
interface IComparisonOperator<T> : IComparisonOperator<T, T>
where T: IComparable<T> { }
interface IComparisonOperator : IComparisonOperator<IComparable, object>
J'ai beaucoup de classes (non génériques) qui mettent en œuvre une ou plusieurs de ces interfaces, par exemple:
class GreaterThanOperator :
IComparisonOperator,
IComparisonOperator<decimal>,
IComparisonOperator<DateTime>,
IComparisonOperator<DateTime, string>
{ ... }
class EqualComparator: IOperator
class RegexOperator : IMatchingOperator { ... }
Maintenant, je veux un pour créer une usine qui peut charger et instancier chaque classe dans les assemblys qui implémente en quelque sorte l'interface parent "IOperator" et la place dans une collection.
J'ai essayé avec:
AppDomain.CurrentDomain.GetAssemblies()
.SelectMany(x => x.GetTypes())
.Where(
x => x.IsGenericType
&& x.GetGenericTypeDefinition() == typeof(IOperator<,>)
&& !x.IsInterface && !x.IsAbstract))
.Select(x => Activator.CreateInstance(x)).ToList();
mais il ne fonctionne pas.
Je souhaite que la liste finale contienne une instance de chaque classe IOperator
. Je vais ensuite parcourir les objets avec la réflexion pour voir quels types génériques ils utilisent.
première question, pourquoi vous essayez de le faire, il semble que vous cherchez technique 'Lazy loading'. –
Ceci serait exécuté dans un constructeur statique d'une usine. La raison en est que je veux connaître tous les opérateurs qui existent. Comment pourrais-je implémenter une approche de chargement paresseux? – AFusco
vous instanciez des types quand vous en avez besoin et si vous le souhaitez, vous pouvez également les mettre en cache dans une propriété statique. –