2011-03-07 33 views
22

可能重複:
How to use reflection to call generic Method?
Select Right Generic Method with Reflection反思:如何得到一個通用的方法?

您好

比方說,我有一個類中的兩個以下兩種方法:

public void MyMethod(object val) {} 
public void MyMethod<T>(T val) {} 

與反思,我能得到這樣的第一種方法:

Type[] typeArray = new Type[1]; 
typeArray.SetValue(typeof(object), 1); 
var myMethod = myInstance.GetType().GetMethod("MyMethod", typeArray); 

但我怎麼能拿到第二,通用的方法是什麼?

+0

可能重複的:http://stackoverflow.com/questions/ 3631547/select-right-generic-method-with-reflection – 2011-03-07 10:19:41

+1

@AakashM:這*不是*特定問題的重複。 – LukeH 2011-03-07 10:28:53

+0

@LukeH你是對的。不過,我敢打賭這是重複的東西。 – AakashM 2011-03-07 10:31:06

回答

37
var myMethod = myInstance.GetType() 
         .GetMethods() 
         .Where(m => m.Name == "MyMethod") 
         .Select(m => new { 
               Method = m, 
               Params = m.GetParameters(), 
               Args = m.GetGenericArguments() 
              }) 
         .Where(x => x.Params.Length == 1 
            && x.Args.Length == 1 
            && x.Params[0].ParameterType == x.Args[0]) 
         .Select(x => x.Method) 
         .First(); 
+1

thx - 沒想到會那麼複雜:-) – sl3dg3 2011-03-07 10:57:45

+0

哇,這太令人討厭 – Eric 2017-09-12 00:18:38

7

我會做這樣的:

var methods = from m in typeof(MyClass).GetMethods() 
       where m.Name == "MyMethod" 
       && m.IsGenericMethodDefinition 

       let typeParams = m.GetGenericArguments() 
       let normalParams = m.GetParameters() 

       where typeParams.Length == 1 && normalParams.Length == 1 
       && typeParams.Single() == normalParams.Single().ParameterType 
       && !typeParams.Single().GetGenericParameterConstraints().Any() 

       select m; 

var myMethod = methods.Single(); 

我們正在尋找一個叫「的MyMethod」方法是沒有約束的單一類型參數的通用方法,並且一個'正常'參數的類型與類型參數相同。

很顯然,如果你不希望非常精確,你可以做最低限度的歧義,如:

var myMethod = typeof(MyClass) 
       .GetMethods() 
       .Single(m => m.Name == "MyMethod" && m.IsGenericMethodDefinition); 
+0

thx - 第二個查詢是一個很好的解決方法。但在某些情況下,我寧願保持精確,因爲有更多的重載方法... – sl3dg3 2011-03-07 10:58:35

相關問題