它听起来不应该是可能的,但我想在写完之前先询问。
我正在编写一个带有插件系统的应用程序,我希望在初始化或构建它之前获取插件类中包含的属性
接口:
public interface IMPlugin
{
string PluginName { get; }
string PluginSafeName { get; }
string PluginDescription { get; }
Version PluginVersion { get; }
string PluginAuthorName { get; }
[DefaultValue(null)]
string PluginAuthorEmail { get; }
[DefaultValue(null)]
string PluginAuthorURL { get; }
[DefaultValue(false)]
bool PluginActive { get; set; }
/// <summary>
/// Plugin ID issued by InputMapper. Used for updates. </summary>
int PluginID { get; }
}
插件:
public class InputMonitor : IMPlugin,ApplicationPlugin
{
public string PluginName { get { return "My Plugin"; } }
public string PluginSafeName { get { return "MyPlugin"; } }
public string PluginDescription { get { return "My Plugin."; } }
public Version PluginVersion { get { return new Version("0.1.0.0"); } }
public string PluginAuthorName { get { return "John Doe"; } }
public string PluginAuthorEmail { get { return "foo@bar.com"; } }
public string PluginAuthorURL { get { return ""; } }
public int PluginID { get { return 0; } }
public bool PluginActive { get; set; }
public InputMonitor()
{
}
}
我的问题是我希望我的应用程序能够在初始化之前检索插件信息,以便用户可以随意激活和停用插件,但插件的详细信息仍然可以在插件浏览器中看到。但我不想依赖插件开发人员在构造函数中不做任何事情,只将代码放在其他接口方法中。
是否可以初始化对象并强制忽略其构造函数,或者是否有某些东西不允许构造函数一起使用?
答案 0 :(得分:3)
听起来你的插件应该通过attributes配置而不是通过公开属性来配置:
[Plugin(Name = "My Plugin", SafeName = "MyPlugin" ...)]
public class InputMonitor
您可以通过反射访问属性,而无需创建类的实例。
毕竟,这是关于类型的元数据 - 而不是关于该类型的任何一个实例的信息。
答案 1 :(得分:0)
初始化一个类并调用它的构造函数是一回事。
要么构造一个插件类的实例,只是为了读取它的属性,然后扔掉它。
或者
你有第二个助手/描述类。 (我知道你不想要)