我正在做以下事情:
其中'fc'是具有属性列表的Control。 'nc'是我放置Property值的地方。
通过下面的路线,我将不得不这样做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;
}
谢谢。
答案 0 :(得分:1)
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);
答案 1 :(得分:1)
你不能只写:
var doit = new Action<FormControlProperty, NoteTemplateControl>((fp, nc) =>
{
// put your code here
});
然后你可以用:
来调用它doit(fp1, nc1);
doit(fp2, nc2);
等...
答案 2 :(得分:1)
您可以使用以下扩展方法。
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 });
}
}
答案 3 :(得分:1)
如果你有一个很大的属性列表,你可以在ForEach循环中使用反射。 (假设财产为IEnumerable<>
)
fc.Property.ToList().ForEach(fp =>
{
var prop = nc.GetType().GetProperty(propName);
if (prop != null)
prop.SetValue(nc, fp.Value);
});