重构委托:预期的方法名称

时间:2018-02-09 21:15:51

标签: c# delegates

enter image description here中有以下代码段:

behaviorManager1 = new DevExpress.Utils.Behaviors.BehaviorManager();
behaviorManager1.Attach<DevExpress.Utils.DragDrop.DragDropBehavior>(editor.GridView, behavior => {
    behavior.Properties.AllowDrop = true;
    behavior.Properties.InsertIndicatorVisible = true;
    behavior.Properties.PreviewVisible = true;
    behavior.DragOver += Behavior_DragOver;
    behavior.DragDrop += Behavior_DragDrop;
});

为了更好地理解,我想重构代码,以便“behavior =&gt;”代码不符合。

我尝试过:

var behaviour = new DragDropBehavior(ctrl.GetType());
behaviour.DragDrop += Behavior_DragDrop;
behaviour.DragOver += Behavior_DragOver;
var action = new Action<DragDropBehavior>(behaviour); // compile error
behaviorManager1.Attach(gridView1, action);

但是,我收到编译错误

  

错误CS0149预期的方法名称

1 个答案:

答案 0 :(得分:1)

初始代码的作用与新代码的作用有所不同。最初你传入一个匿名函数,调用它时会在提供的DragDropBehavior实例上设置一些属性。您的新代码会明确创建DragDropBehavior的实例,并将其填满。

您还尝试创建Action<T>的实例,该实例需要一个委托,而是将其传递给新创建的对象。这就是编译器不喜欢它的原因。

您仍然可以将该参数提取到变量中,但应将其键入为Action<DragDropBehavior>,并且所有赋值都应位于匿名函数中:

behaviorManager1 = new DevExpress.Utils.Behaviors.BehaviorManager();
Action<DragDropBehavior> behaviorDelegate = behavior => {
    behavior.Properties.AllowDrop = true;
    behavior.Properties.InsertIndicatorVisible = true;
    behavior.Properties.PreviewVisible = true;
    behavior.DragOver += Behavior_DragOver;
    behavior.DragDrop += Behavior_DragDrop;
};
behaviorManager1.Attach<DevExpress.Utils.DragDrop.DragDropBehavior>(editor.GridView, behaviorDelegate);