Чтобы решить проблему, которую я имею в своем решении с использованием отражения, мне нужно указать следующий код, чтобы показать пользователю CheckedListBox, который предоставляет список условий, которые они должны выбрать, и в соответствии с их выбором он изменяет определенное поведение в приложении. В это время у меня нет проблем, чтобы получить имя строки унаследованных классов благодаря этому сообщению, но я не мог понять, как получить экземпляр каждого из них.
DataTable table = new DataTable();
table.Columns.Add("Intance", typeof(IConditions)); //INSTANCE of the inherited class
table.Columns.Add("Description", typeof(string)); //name of the inherited class
//list of all types that implement IConditions interface
var interfaceName = typeof(IConditions);
List<Type> inheritedTypes = (AppDomain.CurrentDomain.GetAssemblies()
.SelectMany(s => s.GetTypes())
.Where(p => interfaceName.IsAssignableFrom(p) && p != interfaceName)).ToList();
foreach (Type type in inheritedTypes)
{
IConditions i; //here is where I don't know how to get the instance of the Type indicated by 'type' variable
//I.E: IConditions I = new ConditionOlderThan20(); where 'ConditionOlderThan20' is a class which implements IConditions interface
table.Rows.Add(i, type.Name);
}
Можно ли получить объект? Каков лучший подход к решению таких проблем?
Просто используйте метод Activator.CreateInstance
:
IConditions i = Activator.CreateInstance(type) as IConditions;
Примечание. Это произойдет, если type
не имеет конструктора без параметров. Вы можете использовать следующую версию с параметрами:
public static Object CreateInstance(Type type, params Object[] args)