Конечно, вам просто нужно что-то связать это с пользовательским интерфейсом - я возьму простой выход и приму форму с одним текстовым полем. В зависимости от ваших требований, сетка PropertyInfo или что-то более подходящее.
Что-то вроде:
class PluginUIBuilder {
public void Fill(IPluginSystem p) {
var t = ((object)p).GetType();
foreach (var pi in t.GetProperties()) {
if (pi.GetCustomAttributes(typeof(ExternalInput), true).Length > 0) {
string value = Prompt(pi.Name);
pi.SetValue(p, value, null);
}
}
}
string Prompt(string name) {
using (var f = new InputForm()) {
f.Prompt = "Enter a value for " + name;
if (f.ShowDialog() = DialogResult.OK) {
return f.Value;
}
return null;
}
}
}
// client code
var p = new MyPlugin();
var ui = new PluginUIBuilder();
ui.Fill(p);
p.Execute();
Возможно, вы захотите добавить свойства в свой атрибут для таких вещей, как описания, функция преобразования или класс (может потребоваться использование встроенных преобразователей типов ), проверки и т. Д.
В конце концов, если вы зайдете слишком далеко - вы только что создали среду проектирования WinForm. Но я использовал таблицы сведений о свойствах для запросов для приложений командной строки, чтобы добиться успеха с очень небольшим кодом.