Как создать метод расширения / функцию lamba для этого - PullRequest
1 голос
/ 03 мая 2011

Я делаю следующее:

Где 'fc' это элемент управления со списком свойств.'nc' - это то место, где я помещаю значение свойства.

При указанном ниже маршруте мне нужно будет сделать это 10x, чтобы собрать / отобразить 10 свойств.Есть ли способ сделать это менее повторяющимся?

   FormControl fc;
   FormControlProperty fp;
   NoteTemplateControl nc;
   fp = fc.Property.Find(i => i.name == "Display");
   if (fp != null)
   {
       nc.Display = fp.Value;
   }
   fp = fc.Property.Find(i => i.name == "Text");
   if (fp != null)
   {
       nc.Text = fp.Value;
   }

Спасибо.

Ответы [ 4 ]

1 голос
/ 03 мая 2011

Если у вас есть большой список свойств, которые вы хотите просмотреть, вы можете использовать отражение в цикле ForEach. (при условии, что свойство IEnumerable<>)

fc.Property.ToList().ForEach(fp =>
                      {
                          var prop = nc.GetType().GetProperty(propName);
                          if (prop != null)
                            prop.SetValue(nc, fp.Value);
                      });
1 голос
/ 03 мая 2011

Разве вы не можете просто написать:

var doit = new Action<FormControlProperty, NoteTemplateControl>((fp, nc) =>
    {
        // put your code here
    });

Тогда вы можете позвонить с помощью:

doit(fp1, nc1);
doit(fp2, nc2);

и т. Д. *

1 голос
/ 03 мая 2011

Вы можете использовать следующий метод расширения.

public static void FindProperty(this NoteTemplateControl nc, FormControl fc, string propertyName)
{
    var fp = fc.Property.Find(i => i.name == propertyName);
    if (fp != null)
    {
        var setter = typeof(nc).GetProperty(propertyName).GetSetMethod();
        setter(nc, new object[]{ fp.Value });
    }
}
1 голос
/ 03 мая 2011
public static void Map(this Control fc, string name, Action<string> assign)
{
   var fp = fc.Property.Find(i => i.name == name);
   if (fp != null) assign(fp.Value);
}

использование:

theControl.Map("Display", v => theControl.Display = v);
...