Я десериализирую класс с именем Method
с использованием .NET Serialization. Method
содержит список объектов, реализующих IAction
. Первоначально я использовал атрибут [XmlInclude]
, чтобы указать все классы, которые реализуют IAction
.
Но теперь я хотел бы изменить свою программу, чтобы загрузить все библиотеки DLL в каталог и удалить классы, которые реализуют IAction
. Затем пользователи могут десериализовать файлы, содержащие их действия, реализующие IAction
.
Я больше не управляю классами, которые реализуют IAction
, поэтому я не могу использовать [XmlInclude]
.
Есть ли способ установить этот атрибут во время выполнения? Или есть аналогичный атрибут, установленный для реализующего класса?
public class Method
{
public List<Actions.IAction> Actions = new List<Actions.IAction>();
}
public interface IAction
{
void DoExecute();
}
public static Type[] LoadActionPlugins(string pluginDirectoryPath)
{
List<Type> pluginTypes = new List<Type>();
string[] filesInDirectory = Directory.GetFiles(pluginDirectoryPath, "*.dll", SearchOption.TopDirectoryOnly);
foreach (string pluginPath in filesInDirectory)
{
System.Reflection.Assembly actionPlugin = System.Reflection.Assembly.LoadFrom(pluginPath);
Type[] assemblyTypes = actionPlugin.GetTypes();
foreach (Type type in assemblyTypes)
{
Type foundInterface = type.GetInterface("IAction");
if (foundInterface != null)
{
pluginTypes.Add(type);
}
}
}
return pluginTypes.Count == 0 ? null : pluginTypes.ToArray();
}