add RegisterAll(Assembly) method

This commit is contained in:
2024-05-01 09:09:06 +02:00
parent 554103781a
commit 7936052279

View File

@@ -50,36 +50,36 @@ namespace Pilz.Plugins.Advanced
Modules = new(this);
}
//public void RegisterAll()
//{
// var assembly = Assembly.GetCallingAssembly();
public void RegisterAll(Assembly assembly)
{
const string nameGetFeatures = $"{nameof(IPluginFeaturesProvider.GetFeatures)}";
const string nameGetFeaturesExplicit = $"{nameof(IPluginFeaturesProvider)}.{nameof(IPluginFeaturesProvider.GetFeatures)}";
const string nameInstance = $"get_{nameof(IPluginFeatureProvider.Instance)}";
const string nameInstnaceExplicit = $"get_{nameof(IPluginFeatureProvider)}.{nameof(IPluginFeatureProvider.Instance)}";
// foreach (var type in assembly.GetTypes())
// {
// if (type.IsAssignableFrom(typeof(IPluginFeaturesProvider)))
// {
// var methods = type.GetMethods(BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic);
// var method = methods.FirstOrDefault(n => n.Name == nameof(IPluginFeaturesProvider.GetFeatures) || n.Name.EndsWith(nameof(IPluginFeaturesProvider.GetFeatures)));
foreach (var type in assembly.GetTypes())
{
if (type.IsAssignableTo(typeof(IPluginFeaturesProvider)))
{
var methods = type.GetMethods(BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic);
var method = methods.FirstOrDefault(n => n.Name == nameGetFeaturesExplicit || n.Name == nameGetFeatures);
// if (method != null && method.Invoke(null, null) is PluginFeature[] features)
// {
// foreach (var feature in features)
// Register(feature);
// }
// }
// else if (type.IsAssignableFrom(typeof(IPluginFeatureProvider<>)))
// {
// var methods = type.GetMethods(BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic);
// var method = methods.FirstOrDefault(n => n.Name == nameof(IPluginFeatureProvider<PluginFeature>.Instance) || n.Name.EndsWith(nameof(IPluginFeatureProvider.Instance)));
if (method != null && method.Invoke(null, null) is PluginFeature[] features)
{
foreach (var feature in features)
Register(feature);
}
}
else if (type.IsAssignableTo(typeof(IPluginFeatureProvider)))
{
var methods = type.GetMethods(BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic);
var method = methods.FirstOrDefault(n => n.Name == nameInstnaceExplicit || n.Name == nameInstance);
// if (method != null && method.Invoke(null, null) is PluginFeature[] features)
// {
// foreach (var feature in features)
// Register(feature);
// }
// }
// }
//}
if (method != null && method.Invoke(null, null) is PluginFeature feature)
Register(feature);
}
}
}
public void Register<TProvider>() where TProvider : IPluginFeatureProvider
{