更改C#操作/委托目标:分层调用

更改C#操作/委托目标:分层调用,c#,C#,如果我有 public IList<Entity> Children { get; set; } public NotifyChildren(Func<object, bool> action, object data) { foreach (var child in Children) if (action(data)) /// <-- !!!! need action to work on child this tim

如果我有

public IList<Entity> Children { get; set; }

public NotifyChildren(Func<object, bool> action, object data)
{
   foreach (var child in Children)
       if (action(data))
           /// <-- !!!! need action to work on child this time, not on the original target
           //child.NofifyChildren(action, data); <- this doesn't work because of the above requirement
           child.NotifyChildren(action.ChangeTargetTo(child), data); // << pseudocode!
}

public void SomeChangeOccured()
{
   var changedChild;
   NotifyChildren(x => x.SomeHandler(), "somedata");
}
public IList子项{get;set;}
public NotifyChildren(函数操作、对象数据)
{
foreach(儿童中的儿童变量)
if(行动(数据))
///
foreach(子对象中的变量子对象)
if(行动(数据))
///您具体要求的是不可能的。委托表示静态绑定的方法,而您正在寻找动态的方法。要具体做到这一点,您需要反射

然而,您的代码似乎是以正确的方式构造的,可以实现您想要的功能,但是代码似乎没有被正确调用

您将
action
定义为
Func
,但传入的是
数据(它是
对象
),而不是
子对象
(它是
实体

public IList<Entity> Children { get; set; }

public NotifyChildren(Func<Entity, object, bool> action, object data)
{
   foreach (var child in Children)
   {
       if (action(child, data))
       {
           child.NofifyChildren(action, data); 
       }
   }
}

public void SomeChangeOccured()
{
     NotifyChildren((x, data) => x.SomeHandler(data), "somedata");
}

public bool SomeHandler(object data)
{
     return true; // obviously need more robust logic
}
public IList子项{get;set;}
public NotifyChildren(函数操作、对象数据)
{
foreach(儿童中的儿童变量)
{
if(动作(子项、数据))
{
儿童(行动、数据);
}
}
}
已发生公共无效更改()
{
NotifyChildren((x,data)=>x.SomeHandler(data),“somedata”);
}
公共bool SomeHandler(对象数据)
{
return true;//显然需要更健壮的逻辑
}

因为我需要;-)这里的action只是一个方法名,比如说“HandleNameChange”。我想为所有子级调用它,如果子级决定调用,他们想对其子级调用它。这是一种冒泡事件传递。在这个调用中将子级实例传递给action的位置?或者可以在child.NofifyChildren(action,data)之后更改action;call?bu where ref关键字在本例中?您的示例代码是否位于名为Entity的类中?实际上它位于父类中,但并不重要。在本例中,我编写它时将其视为位于子类中。事实上,我认为这使您的问题变得模棱两可:Entity是分层对象(具有自引用)吗是否?您的目标是反复通知子实体您的根实体上发生的更改吗?最后,该过程的入口点是什么?实际上,对于未绑定的委托是可能的,但在这种情况下,您的解决方案似乎更好。FWIW,如果不这样做,您也可以直接从
SomeHandler
创建委托请注意使用反射获取其
MethodInfo
。我已修复签名。您提供的内容不起作用,因为操作仍将在原始顶级实体上起作用-我需要在子级实体上调用它。您确实调用了操作(子级,数据),但这是我不想使用的“静态委托”方法(将此作为第一个方法传递给静态函数)。@queen:正如我所说的,除非你沿着反射的道路走,否则你所要求的是不可能的。使用此签名仍然允许“冒泡”您正在寻找的方法。鉴于唯一实际的方法声明是在lambda中完成的,我不明白您为什么要反对。该方法没有在子对象上调用,但您将子对象作为该方法的第一个参数。这难道不可以接受吗?这是因为我……我想……有点累;-)我知道这很简单——我一直都在使用lambdas,但是……我想这周就要结束了。
foreach (var child in Children)
   if (action(data))
       /// <-- !!!! need action to work on child this time, not on the original target
       child.NofifyChildren(action, data); 
public IList<Entity> Children { get; set; }

public NotifyChildren(Func<Entity, object, bool> action, object data)
{
   foreach (var child in Children)
   {
       if (action(child, data))
       {
           child.NofifyChildren(action, data); 
       }
   }
}

public void SomeChangeOccured()
{
     NotifyChildren((x, data) => x.SomeHandler(data), "somedata");
}

public bool SomeHandler(object data)
{
     return true; // obviously need more robust logic
}