在 .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));
你肯定会使用你的第一个重载,因为不需要转换。没有转化比转化更好。
我对某事 "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));
你肯定会使用你的第一个重载,因为不需要转换。没有转化比转化更好。