避免歧义匹配异常


115

我通过反射在类型上调用静态方法Parse,因为我在编译时不知道对象的类型(但是我知道,它有一个Parse方法,需要一个字符串)。

但是,我得到了一个模棱两可的match异常,大概是因为有很多重载的Parse方法,每个方法都带有一个对象(字符串,int,double等)。

如何在我的方法调用中更加具体,以确保到达正确的方法(Parse(string s))并且不引发异常。

我的代码如下所示:

Type returnType = p.PropertyType;
object value = returnType.GetMethod("Parse").Invoke(null, new string[] { "1" });

Answers:


193

使用重载并使用

returnType.GetMethod("Parse", new [] {typeof(string)})

9
@Bitterblue我很困惑为什么您要写那条评论-为什么您认为值得讨论的风格问题?
本杰明·波兹尊

9
演示文稿很好,只是碰巧采用了与您喜欢的风格不同的风格。您评论了“如果不那么蓝色,我会用这个自行车棚”。这让我感到困惑。编辑评论:除非您不知道new [] {}实际上会推断Array的类型,并且在这种情况下IS等于new Type []?在那种情况下,我很抱歉-我以为您对样式发表评论(都可行),同时可能认为该摘要是错误的(不是)。
本杰明·波兹尊

1
伙计们,谢谢你的回答。为了节省下一个麻烦,对于引用类型,请使用类似以下的内容:typeof(string).MakeByRefType();
BRebey

5
@Bitterblue我不是“年轻”,那听起来确实居高临下。不能阅读的程序员new [] { typeof(string) }除了维护代码外还有其他问题。类型就在那。再加上“疯狂的单线”并不重要,您喜欢的样式只会在这行中添加多余的字母。我认为这new Type[] {...}不太可读,因为该行较长,并且与信息/样板/噪声无关。因此:这是一个风格问题,你有被动攻击开始讨论“本来upvoted,是否会满足我的口味” ..
本杰明Podszun

2
请注意,如果2个方法具有相同的名称,相同数量的参数和相同类型的参数,则它将不起作用。我在这里考虑显式强制转换运算符重载。例如public static explicit double(MyType obj)public static explicit float(MyType obj)。您仍然会有一个AmbiguousMatchException。在这种情况下,您可以使用returnType.GetMethods().SingleOrDefault(m => m.Name == "op_Explicit" && m.ReturnType == typeof(float))例如。
纪尧姆
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.