在 .Net 中使用动态重载方法

Overloading a method using dynamics in .Net

我对某事 "why" 有点困惑,我想在部署之前得到一些澄清。

我有一个 DAL 库,它基本上将所有数据调用汇集到两个函数。它实际上是一个函数,但我编写了一个重载来接受数据对象,将其转换为 ExpandoObject,并将查询参数构建为 KeyValuePairs<string, dynamic> 以满足原始函数。

public static IEnumerable<T> ResultSet<T>(string conn, string query, params KeyValuePair<string, dynamic>[] pmts)...

public static IEnumerable<T> ResultSet<T>(string conn, string query, dynamic dao)…

我的问题是这样的;为什么这是一个有效的重载? params 关键字是什么防止了歧义问题?由于我正在使用 dynamic,并且在测试中一切都很好,我觉得我应该更好地理解为什么这是在投入生产之前允许的过载(以免它爆炸)。

有效的重载是定义上不同的所有内容,意思是不完全相同。这里就是这种情况。重载定义不再检查。

解决使用现场可能出现的歧义,应用调用。 始终可以显式键入每个参数并以这种方式选择您想要的重载。

如果任何类型转换是必要的并且隐式可能,编译器将尝试找到 "Better conversion"。数据丢失的可能性越小越好。

仅当通过此选择最终得到多个重载并应用了排名相同的转换时,您才会在调用位置收到歧义错误。

如果你打电话给

ResultSet<object>("connection", "query", new KeyValuePair<string, dynamic>("test", null));

你肯定会使用你的第一个重载,因为不需要转换。没有转化比转化更好。