2013-07-10 45 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

沒有非標準重載與不同類型的方法之間做出選擇。你必須自己找到方法。您可以編寫自己的擴展方法,像這樣:

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上。哪裏?它也給返回類型上的錯誤。GetMethod(「op_Explicit」,BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic,new Type [] {type},returnType); – user1872492

+0

導入System.Reflection與'在你的文件開始使用System.Reflection' –

+0

我已經導入System.Reflection – user1872492

相關問題