如何为此创建扩展方法/ lambda函数

时间:2011-05-03 17:50:09

标签: c# lambda extension-methods

我正在做以下事情:

其中'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;
   }

谢谢。

4 个答案:

答案 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);
                      });