Я делаю следующее:
Где '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; }
Спасибо.
Если у вас есть большой список свойств, которые вы хотите просмотреть, вы можете использовать отражение в цикле ForEach. (при условии, что свойство IEnumerable<>)
IEnumerable<>
fc.Property.ToList().ForEach(fp => { var prop = nc.GetType().GetProperty(propName); if (prop != null) prop.SetValue(nc, fp.Value); });
Разве вы не можете просто написать:
var doit = new Action<FormControlProperty, NoteTemplateControl>((fp, nc) => { // put your code here });
Тогда вы можете позвонить с помощью:
doit(fp1, nc1); doit(fp2, nc2);
и т. Д. *
Вы можете использовать следующий метод расширения.
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 }); } }
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);