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

发布于 2024-11-04 20:18:19 字数 449 浏览 3 评论 0原文

我正在执行以下操作:

其中“fc”是带有属性列表的控件。 “nc”是我放置属性值的地方。

根据下面所示的路线,我将必须执行 10 次才能收集/映射 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;
   }

谢谢。

I am doing the following:

Where 'fc' is a Control with list of properties. 'nc' is where I am putting the Property value.

With the route seen below I will have to do this 10x to collect/map 10 Properties. Is there way to make this less repetitive?

   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;
   }

Thank you.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

红墙和绿瓦 2024-11-11 20:18:19
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);
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);
}

usage:

theControl.Map("Display", v => theControl.Display = v);
风情万种。 2024-11-11 20:18:19

你不能只写:

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

然后你可以用:

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

等等来调用它...

Can't you just write:

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

Then you can call it with:

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

etc...

看春风乍起 2024-11-11 20:18:19

如果您有大量属性需要查看,则可以在 ForEach 循环中使用反射。 (假设属性是 IEnumerable<>

fc.Property.ToList().ForEach(fp =>
                      {
                          var prop = nc.GetType().GetProperty(propName);
                          if (prop != null)
                            prop.SetValue(nc, fp.Value);
                      });

If you have a big list of properties to go through, you could use reflection in a ForEach loop. (assuming Property is IEnumerable<> )

fc.Property.ToList().ForEach(fp =>
                      {
                          var prop = nc.GetType().GetProperty(propName);
                          if (prop != null)
                            prop.SetValue(nc, fp.Value);
                      });
落花浅忆 2024-11-11 20:18:19

您可以使用以下扩展方法。

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

You can use the following Extension method.

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 });
    }
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文