Использование атрибутов C # для получения входных данных для создания системы, независимой от пользовательского интерфейса - PullRequest
0 голосов
/ 31 августа 2009
public class MyPlugin : IPluginSystem
{
    [ExternalInput]
    public String myExternalProperty { get; set; }

    public bool execute()
    {
         if (myExternalProperty.Equals("My setter is called from elsewhere"))
             return true;
         return false;
    }
}

Возможно ли это? Как бы я этого достиг? Нужно ли указывать typeof (X) также в атрибуте?

Ответы [ 2 ]

2 голосов
/ 31 августа 2009

Попробуйте взглянуть на MEF (Managed Extensibility Framework), если у вас его нет. Судя по тому, что вы хотите сделать, это идеальное совпадение.

0 голосов
/ 31 августа 2009

Конечно, вам просто нужно что-то связать это с пользовательским интерфейсом - я возьму простой выход и приму форму с одним текстовым полем. В зависимости от ваших требований, сетка 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. Но я использовал таблицы сведений о свойствах для запросов для приложений командной строки, чтобы добиться успеха с очень небольшим кодом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...