C#带dynamic参数的委托无法适配string/float参数方法的解决办法
解决方法
试试用Lambda表达式包装原有方法,就能让它们适配带dynamic参数的委托。因为dynamic是运行时解析类型,Lambda可以当中间层,把委托的dynamic参数转成对应方法需要的强类型,运行时会自动匹配正确的重载。
具体代码示例
假设你的两个Insert方法是这样的:
public AVLNode InsertString(AVLNode node, string key) { // 字符串插入逻辑实现 } public AVLNode InsertFloat(AVLNode node, float key) { // 浮点数插入逻辑实现 }
你可以这么创建委托实例,分别绑定到对应的方法:
// 绑定字符串插入方法 Insert stringInsert = (node, key) => InsertString(node, (string)key); // 绑定浮点插入方法 Insert floatInsert = (node, key) => InsertFloat(node, (float)key);
嫌强制转换麻烦的话,也可以利用dynamic的运行时重载解析,不用显式转类型(不过显式转能避免运行时类型不匹配的报错,更稳妥):
Insert stringInsert = (node, key) => InsertString(node, key); Insert floatInsert = (node, key) => InsertFloat(node, key);
调用委托的时候,只要传入的key实际类型是string或者float,运行时会自动找到对应的方法重载完成调用。
原理说明
- 委托参数是
dynamic,Lambda的参数也会被推断成dynamic。 - 在Lambda里调用强类型方法时,
dynamic参数会在运行时做类型检查,匹配对应的方法重载。 - 这种方式不用改原有方法的参数类型,还保留了委托的
dynamic设计,刚好满足你的需求。
内容的提问来源于stack exchange,提问作者Katze
相关产品推荐
相关产品推荐

