Ich deserialisiere eine Klasse namens Method
mit .NET Serialisierung. Method
enthält eine Liste von Objekten, die IAction
implementieren. Ich habe ursprünglich das Attribut [XmlInclude]
verwendet, um alle Klassen anzugeben, die IAction
implementieren.Serialisierung ohne XmlInclude
Aber jetzt möchte ich mein Programm ändern, um alle DLLs in einem Verzeichnis zu laden und die Klassen zu entfernen, die IAction
implementieren. Dann können Benutzer Dateien deserialisieren, die ihre Aktionen enthalten, die IAction
implementieren.
Ich kontrolliere nicht die Klassen, die IAction
mehr implementieren, daher kann ich [XmlInclude]
nicht verwenden.
Gibt es eine Möglichkeit, dieses Attribut zur Laufzeit zu setzen? Oder haben Sie ein ähnliches Attribut für die implementierende Klasse?
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();
}