У меня есть несколько классов, все они находятся в отдельном пространстве имен. Все классы происходят от одного и того же базового класса, все имеют одну и ту же функцию и принимают одни и те же параметры. Я хотел бы иметь возможность перебирать классы, вызывая указанную функцию.
Я знаю, что могу получить список классов, используя следующее:
var validationClasses = Assembly.GetExecutingAssembly().GetTypes()
.Where(t => t.Namespace == "Panther.Business.Shipping.Validate")
.ToList();
И, конечно же, я могу перебирать каждый класс в validationClasses.
Но я не могу понять, как создать экземпляр каждого класса и вызвать эту функцию.
Любое направление высоко ценится.
validationClasses
— это набор типов. Вам нужно использовать Acticator.CreateInstance
для создания экземпляров типов в этой коллекции. stackoverflow.com/questions/752/…Вы пытаетесь сделать то, что любой DI-контейнер делает из коробки. Хотя это может быть полезно для образовательных целей, рассмотрите возможность использования DI. По крайней мере, это будет более реалистичный сценарий.
Предполагая базовый класс ValidationBase, вы можете сделать что-то вроде:
Type baseType = typeof(ValidationBase);
MethodInfo method = baseType.GetMethod("MethodName");
var validationClasses = Assembly.GetExecutingAssembly()
.GetTypes()
.Where(t => t.IsSubclassOf(baseType));
foreach(Type t in validationClasses)
{
var instance = Activator.CreateInstance(t);
method.Invoke(instance, null); // Replace `null` with array of arguments if necessary
}
См. этот ответ