避免模​​糊的匹配异常

Ben*_*Ben 110 c# reflection ambiguous-call

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

但是,我得到了一个模糊的匹配异常,大概是因为有很多重载的Parse方法,每个方法都占用一个对象(string,int,double等).

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

我的代码看起来像这样:

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

Ben*_*zun 181

使用重载并使用

returnType.GetMethod("Parse", new [] {typeof(string)})
Run Code Online (Sandbox Code Playgroud)

  • @Bitterblue我很困惑为什么你会写这个评论 - 为什么你认为风格值得讨论? (8认同)
  • 演示文稿很好,它恰好采用了与您喜欢的风格不同的风格.你评论说:"我会使用这个自行车棚,如果它有点偏蓝".这让我很困惑.编辑注释:除非您不知道new [] {}实际推断出Array的类型,并且_IS_等效于新Type []在这种情况下?在那种情况下,我很抱歉 - 我认为你评论了风格(两种作品),同时可能认为代码片段是错误的(事实并非如此). (8认同)
  • @Bitterblue我不是'年轻',这肯定听起来居高临下.一个无法读取```new [] {typeof(string)}```的程序员还有其他问题,而不是维护代码.这种类型就在那里.再加上"疯狂的单行"并不重要,你喜欢的风格只是在这一行中添加多余的字母.我认为```new Type [] {...}```的可读性较差,因为该行更长,而且是无关的信息/样板/噪音.因此:这是一个风格的问题,你开始讨论与被动的侵略性"如果它能满足我的口味,就会投赞成票". (4认同)
  • 谢谢你们的回答,伙计们。为了给下一个人省去一些麻烦,对于引用类型,请使用如下所示的内容: typeof(string).MakeByRefType(); (3认同)
  • 请注意,如果 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))`。 (3认同)