Je désérialise une classe appelée Method
en utilisant la sérialisation .NET. Method
contient une liste d'objets implémentant IAction
. J'ai initialement utilisé l'attribut [XmlInclude]
pour spécifier toutes les classes qui implémentent IAction
.Sérialisation sans XmlInclude
Mais maintenant, je voudrais changer mon programme pour charger toutes les DLL dans un répertoire et supprimer les classes qui implémentent IAction
. Les utilisateurs peuvent ensuite désérialiser les fichiers contenant leurs actions en implémentant IAction
.
Je ne contrôle plus les classes qui implémentent IAction
, donc je ne peux pas utiliser [XmlInclude]
.
Existe-t-il un moyen de définir cet attribut lors de l'exécution? Ou avez un ensemble d'attributs similaire pour la classe d'implémentation?
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();
}