2013-07-10 4 views
2

я писал этот код:AmbiguousMatchException выброшен

MethodInfo method2 = typeof(IntPtr).GetMethod(
      "op_Explicit", 
      BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic, 
      null, 
      new Type[]{ 
     typeof(IntPtr), 

     }, 
      null 

      ); 

если я пытаюсь запустить я получаю ambiguousmatchexception, как я могу решить эту проблему? благодаря

Метод я пытаюсь получить это op_Explicit (IntPtr) возвращает значение int32

ответ

2

Там нет Standart перегрузок для выбора между методами с различными типами , Вы должны найти метод самостоятельно. Вы можете написать свои собственные методы расширения, как это:

public static class TypeExtensions { 
    public static MethodInfo GetMethod(this Type type, string name, BindingFlags bindingAttr, Type[] types, Type returnType) { 
     var methods = type 
      .GetMethods(BindingFlags.Static | BindingFlags.Public) 
      .Where(mi => mi.Name == "op_Explicit") 
      .Where(mi => mi.ReturnType == typeof(int)); 

     if (!methods.Any()) 
      return null; 

     if (methods.Count() > 1) 
      throw new System.Reflection.AmbiguousMatchException(); 


     return methods.First(); 
    } 

    public static MethodInfo GetExplicitCastToMethod(this Type type, Type returnType) 
    { 
     return type.GetMethod("op_Explicit", BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic, new Type[] { type }, returnType); 
    } 
} 

И затем использовать его:

MethodInfo m = typeof(IntPtr).GetExplicitCastToMethod(typeof(int)); 

точно, есть два определенных забросы в классе IntPtr:

public static explicit operator IntPtr(long value) 
public static explicit operator long(IntPtr value) 

И не определено в классе System.Int64 (long является псевдонимом Int64).

Вы можете использовать Convert.ChangeType для этих целей

+0

привет, спасибо за ответ, но почему она дает мне errorr на .где? он также дает ошибку при возврате type.GetMethod ("op_Explicit", BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic, новый тип [] {type}, returnType); – user1872492

+0

import System.Reflection с 'using System.Reflection' в начале вашего файла –

+0

Я уже импортировал System.Reflection – user1872492

1

Есть несколько явных операторов, которые позволяют IntPtr в качестве параметра, и они отличаются только их типы возврата. Попробуйте использовать решение от этого вопроса, чтобы получить метод, который вас интересует, указав не только тип параметров, но и возвращать тип:

Get only Methods with specific signature out of Type.GetMethods()

Смежные вопросы