菜鸟想写一个委托,参数类型不确定,要如何写呢

goodgame365 2021-01-16 11:16:03
比如 我写一个通用的插入数据的委托,

思路这样:

public delegate int insertData(参数); //这个参数类型有可能是 int 也有可能是自定义的类型(模型)

每张表的都有自己的模型,所以这个参数是类型是不固定的,那这个委托的参当我怎么写呢

感谢高人指点
...全文
247 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
泛型,在 c++ 中叫做“模板”,都是靠谱的概念,也就是编译器的一种语法糖。你知道自己要针对 n 种类型都是用这个模板来生成代码,于是使用泛型,并且编译器也就会严格检查泛型参数(类型)的设计 bug。

因此我们设计一个系统,首先要检视“自己”,监视可行性。没有“万能的”代码能靠意念编程,只能靠我们自己的认知。
  • 打赏
  • 举报
回复
这个不是你“写委托”,而是你定义一个接口定义,然后由你的 GetRoomListByUnitID 方法的调用者来写个委托传给你。你把需求模式说反了。

在你的 GetRoomListByUnitID 中,你原来的输入输出是什么,那么你的 委托声明就是什么。例如
public string GetRoomListByUnitID(int UnitID, Func<int, DataTable> getRoomList)
{
.........
}
你写不出超出你自己认知范围的代码。要想写出有创意的代码,那么你要先把原始的 DALHouse.GetRoomList(UnitID) 改成有创意的形式来,此时与委托无关!
goodgame365 2021-01-17
  • 打赏
  • 举报
回复
引用 8 楼 以专业开发人员为伍 的回复:
[quote=引用 楼主 goodgame365 的回复:]比如 我写一个通用的插入数据的委托
不需要写什么“通用的委托”。只有服务才“定义”委托,并且由“客户程序”提供委托。如果你写一个服务Class,提供什么委托呢?它的每一个 Method 都可以被客户程序方便地调用,还写什么委托?[/quote] 感觉需要,比如我这个方法,类似的写了好多个,但里面只有 DataTable dt = DALHouse.GetRoomList(UnitID);这句不同,所以才想到如果参数也能是方法就好了,结果C#就有委托这种操作了,后来又发现,每插入的数据模型都不同,所以又想到如果参数类型可以确定,结果C#又有泛型这种概念,看来菜鸟的看似种种天真的想法,前人就遇到了,所以就有了委托和泛型出来。
public string GetRoomListByUnitID(int UnitID)
        {
            int erro = -1;
            var list = new JArray();
            JObject Job = new JObject();
            DataTable dt = DALHouse.GetRoomList(UnitID);
            if (dt != null && dt.Rows.Count>0)
            {
                erro = 1;
                list = JsonDo.DataTableToJson(dt);
 
            }
 
            Job.Add(new JProperty("list", list));
 
 
            return JsonDo.JobjectToJson(Job, erro);
        }
  • 打赏
  • 举报
回复
引用 楼主 goodgame365 的回复:
比如 我写一个通用的插入数据的委托


不需要写什么“通用的委托”。只有服务才“定义”委托,并且由“客户程序”提供委托。如果你写一个服务Class,提供什么委托呢?它的每一个 Method 都可以被客户程序方便地调用,还写什么委托?
  • 打赏
  • 举报
回复
引用 3 楼 goodgame365 的回复:
谢谢,的确是泛类型比较符合我的想法,之前有看过,但一直搞不懂他的语法,被这种<>符号吓到了,今天总算明白一点了!


泛型不是说什么“参数类型不确定”,相反地,泛型是靠谱的、在运行前就要比 JIT 编译完毕的,在源代码中必须明确声明泛型参数
  • 打赏
  • 举报
回复
“类型不确定”,但是接口应该确定。

如果数据符合多种接口,那么你应该提供多种事件。
白衣如花 2021-01-16
  • 打赏
  • 举报
回复
可以直接用系统自带的带返回参数的委托Func<>
goodgame365 2021-01-16
  • 打赏
  • 举报
回复
有些东西,没到用的时候,真是难学,一需要用到,感觉就像开挂了,给网友一点醒,立马就秒懂了!
goodgame365 2021-01-16
  • 打赏
  • 举报
回复
谢谢,的确是泛类型比较符合我的想法,之前有看过,但一直搞不懂他的语法,被这种<>符号吓到了,今天总算明白一点了!
  • 打赏
  • 举报
回复
推荐用泛型.
八爻老骥 2021-01-16
  • 打赏
  • 举报
回复
可以用Object,或是用泛型。
呵呵,关键自己程序里要用到 所以开发了这个小功能 很多地方很粗糙,俺菜鸟,高手们就别贬我了。 使用的时候把2个dll放到你的程序目录,在资源管理器引用LOADing.dll 就可以了,DevComponents.DotNetBar2.dll为确定按钮控件的引用 列子: private void dl_Click(object sender, EventArgs e) { LOADing.FORMshow load = new LOADing.FORMshow(); load.showto(this, delegate { hand(new object[] { load, "正在处理数据" }); },false); } private void hand(object fr) { int i = 0; while (i < 100) { i++; ((LOADing.FORMshow)((object[])(fr))[0]).send((string)((object[])(fr))[0]+i.ToString()); System.Threading.Thread.Sleep(100); } } 主要用于处理数据的时候,提示用户处理过程,防止界面假死,数据处理完毕后会自动关闭窗体。 注:this为所要调用等待窗体的主窗体对象,中间为数据传递的委托,显示数据处理的过程.load.showto(this, delegate { hand(new object[] { load, "正在处理数据" }); });中new object[] 第一个参数一定要为固定的参数:创建LOADing.FORMshow的实例,后面再就可跟任意数据,都可在方法的过程中调用显示,最后的bool参数:false方法函数执行完毕后自动关闭窗体显示;true为方法执行完毕后出现确定按钮并阻塞主线程UI,点击确定后关闭提示窗体并取消阻塞线程,这么简单,用相信大家都会用了。 界面没有进行美化,感觉这样的就可以了,随后会升级为可自定义界面! 有问题加我QQ76230454

110,535

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧