实现原理:使用扩展方法。

    /// <summary>
    /// 控件扩展
    /// </summary>
    public static class controlext
    {
        /// <summary>
        /// 文件拖拽支持
        /// </summary>
        /// <param name="control"></param>
        /// <param name="filenamescallback">拖拽的文件路径列表</param>
        public static void controlusedrop(this control control,action<list<string>> filenamescallback)
        {
            control.allowdrop = true;//设置控件运行拖放
            control.dragenter += control_dragenter;
            control.dragdrop += (sender,e)=> {
                array array = e.data.getdata(dataformats.filedrop) as array;
                list<string> filenames = new list<string>();
                foreach (object item in array)
                {
                    filenames.add(item.tostring());
                }
                filenamescallback?.invoke(filenames);
            };
        }private static void control_dragenter(object sender, drageventargs e)
        {
            if (e.data.getdatapresent(dataformats.filedrop))
            {
                e.effect = dragdropeffects.link;
            }
            else
            {
                e.effect = dragdropeffects.none;
            }
        }
    }

使用方法:在窗体的load事件或构造方法中:

  this.txt_selectfiles.controlusedrop(files => {
                filenames=files.where(f => f.endswith(".sql")).tolist();
                this.txt_selectfiles.text = string.join("\r\n", filenames);
            });

扩展方法是.net提供的一个语法糖,使用它可以很方便的封装一些通用功能。