结论:
以下是测试代码:
以非泛型方式调用泛型方法(三)_休闲using System;
以非泛型方式调用泛型方法(三)_休闲
using System.Collections.Generic;
以非泛型方式调用泛型方法(三)_休闲
using System.Reflection;
以非泛型方式调用泛型方法(三)_休闲
using System.Text;
以非泛型方式调用泛型方法(三)_休闲
以非泛型方式调用泛型方法(三)_休闲
namespace GenericMethodTest
以非泛型方式调用泛型方法(三)_休闲_07
{
以非泛型方式调用泛型方法(三)_休闲_10    
// 为泛型方法定义的委托
以非泛型方式调用泛型方法(三)_休闲_10
    public delegate void GM<T>(T obj, IList<T> list);
以非泛型方式调用泛型方法(三)_休闲_10
以非泛型方式调用泛型方法(三)_休闲_10    
// 为非泛型方法定义的接口
以非泛型方式调用泛型方法(三)_休闲_10
    public interface ING
以非泛型方式调用泛型方法(三)_泛型_15    
{
以非泛型方式调用泛型方法(三)_休闲_10        
void NGM(object obj, object list);
以非泛型方式调用泛型方法(三)_泛型_19    }

以非泛型方式调用泛型方法(三)_休闲_10
以非泛型方式调用泛型方法(三)_休闲_10    
class Program
以非泛型方式调用泛型方法(三)_泛型_22    
{
以非泛型方式调用泛型方法(三)_休闲_10        
static void Main(string[] args)
以非泛型方式调用泛型方法(三)_休闲_26        
{
以非泛型方式调用泛型方法(三)_休闲_10            List
<int> list = new List<int>();
以非泛型方式调用泛型方法(三)_休闲_10            System.Diagnostics.Stopwatch watch 
= new System.Diagnostics.Stopwatch();
以非泛型方式调用泛型方法(三)_休闲_10            watch.Reset();
以非泛型方式调用泛型方法(三)_休闲_10            watch.Start();
以非泛型方式调用泛型方法(三)_休闲_10            
for (int i = 0; i < 1000000; i++)
以非泛型方式调用泛型方法(三)_职场_34            
{
以非泛型方式调用泛型方法(三)_休闲_10                list.Add(i);
以非泛型方式调用泛型方法(三)_泛型_19            }

以非泛型方式调用泛型方法(三)_休闲_10            watch.Stop();
以非泛型方式调用泛型方法(三)_休闲_10            
long l1 = watch.ElapsedMilliseconds;
以非泛型方式调用泛型方法(三)_休闲_10            watch.Reset();
以非泛型方式调用泛型方法(三)_休闲_10            watch.Start();
以非泛型方式调用泛型方法(三)_休闲_10            GM
<int> gm = new GM<int>(Program.Add);
以非泛型方式调用泛型方法(三)_休闲_10            
for (int i = 0; i < 1000000; i++)
以非泛型方式调用泛型方法(三)_职场_45            
{
以非泛型方式调用泛型方法(三)_休闲_10                gm(i, list);
以非泛型方式调用泛型方法(三)_泛型_19            }

以非泛型方式调用泛型方法(三)_休闲_10            watch.Stop();
以非泛型方式调用泛型方法(三)_休闲_10            
long l2 = watch.ElapsedMilliseconds;
以非泛型方式调用泛型方法(三)_休闲_10            watch.Reset();
以非泛型方式调用泛型方法(三)_休闲_10            watch.Start();
以非泛型方式调用泛型方法(三)_休闲_10            MethodInfo mi 
= typeof(Program).GetMethod("Add");
以非泛型方式调用泛型方法(三)_休闲_10            MethodInfo gmi 
= mi.MakeGenericMethod(typeof(int));
以非泛型方式调用泛型方法(三)_休闲_10            
for (int i = 0; i < 1000000; i++)
以非泛型方式调用泛型方法(三)_休闲_57            
{
以非泛型方式调用泛型方法(三)_职场_60                gmi.Invoke(
nullnew object[] { i, list });
以非泛型方式调用泛型方法(三)_泛型_19            }

以非泛型方式调用泛型方法(三)_休闲_10            watch.Stop();
以非泛型方式调用泛型方法(三)_休闲_10            
long l3 = watch.ElapsedMilliseconds;
以非泛型方式调用泛型方法(三)_休闲_10            watch.Reset();
以非泛型方式调用泛型方法(三)_休闲_10            watch.Start();
以非泛型方式调用泛型方法(三)_休闲_10            ING ng1 
= GetNGC(typeof(int), typeof(Program), "Add");
以非泛型方式调用泛型方法(三)_休闲_10            
for (int i = 0; i < 1000000; i++)
以非泛型方式调用泛型方法(三)_休闲_70            
{
以非泛型方式调用泛型方法(三)_休闲_10                ng1.NGM(i, list);
以非泛型方式调用泛型方法(三)_泛型_19            }

以非泛型方式调用泛型方法(三)_休闲_10            watch.Stop();
以非泛型方式调用泛型方法(三)_休闲_10            
long l4 = watch.ElapsedMilliseconds;
以非泛型方式调用泛型方法(三)_休闲_10            watch.Reset();
以非泛型方式调用泛型方法(三)_休闲_10            watch.Start();
以非泛型方式调用泛型方法(三)_休闲_10            ING ng2 
= InterfaceGenerator.GetInterface<ING>(new GM<int>(Program.Add));
以非泛型方式调用泛型方法(三)_休闲_10            
for (int i = 0; i < 1000000; i++)
以非泛型方式调用泛型方法(三)_泛型_81            
{
以非泛型方式调用泛型方法(三)_休闲_10                ng2.NGM(i, list);
以非泛型方式调用泛型方法(三)_泛型_19            }

以非泛型方式调用泛型方法(三)_休闲_10            watch.Stop();
以非泛型方式调用泛型方法(三)_休闲_10            
long l5 = watch.ElapsedMilliseconds;
以非泛型方式调用泛型方法(三)_休闲_10            Console.WriteLine(
"{0}\n{1} vs {2} vs {3} vs {4} vs {5}", list.Count, l1, l2, l3, l4, l5);
以非泛型方式调用泛型方法(三)_休闲_10            Console.ReadLine();
以非泛型方式调用泛型方法(三)_泛型_19        }

以非泛型方式调用泛型方法(三)_休闲_10
以非泛型方式调用泛型方法(三)_休闲_10        
public static void Add<T>(T obj, IList<T> list)
以非泛型方式调用泛型方法(三)_泛型_93        
{
以非泛型方式调用泛型方法(三)_休闲_10            list.Add(obj);
以非泛型方式调用泛型方法(三)_泛型_19        }

以非泛型方式调用泛型方法(三)_休闲_10
以非泛型方式调用泛型方法(三)_休闲_10        
static ING GetNGC(Type genericType, Type methodType, string methodName)
以非泛型方式调用泛型方法(三)_泛型_100        
{
以非泛型方式调用泛型方法(三)_休闲_10            MethodInfo mi 
= methodType.GetMethod(methodName);
以非泛型方式调用泛型方法(三)_休闲_10            MethodInfo gmi 
= mi.MakeGenericMethod(genericType);
以非泛型方式调用泛型方法(三)_休闲_10            Delegate gmd 
= Delegate.CreateDelegate(typeof(GM<>).MakeGenericType(genericType), gmi);
以非泛型方式调用泛型方法(三)_休闲_10            
return Activator.CreateInstance(typeof(GClass<>).MakeGenericType(genericType), gmd) as ING;
以非泛型方式调用泛型方法(三)_泛型_19        }

以非泛型方式调用泛型方法(三)_泛型_19    }

以非泛型方式调用泛型方法(三)_休闲_10
以非泛型方式调用泛型方法(三)_休闲_10    
public class GClass<T> : ING
以非泛型方式调用泛型方法(三)_职场_111    
{
以非泛型方式调用泛型方法(三)_休闲_10        
private GM<T> m_gmd;
以非泛型方式调用泛型方法(三)_休闲_10
以非泛型方式调用泛型方法(三)_休闲_10        
public GClass(GM<T> gmd)
以非泛型方式调用泛型方法(三)_泛型_117        
{
以非泛型方式调用泛型方法(三)_休闲_10            m_gmd 
= gmd;
以非泛型方式调用泛型方法(三)_泛型_19        }

以非泛型方式调用泛型方法(三)_休闲_10
以非泛型方式调用泛型方法(三)_休闲_123        
INGClass 成员
以非泛型方式调用泛型方法(三)_泛型_19    }

以非泛型方式调用泛型方法(三)_休闲_135}

以非泛型方式调用泛型方法(三)_休闲
测试结果:
方案 耗时 比对 其他优点
直接调用 18 1 不通用
泛型委托包装 43 2.39 不通用
反射 16538 918.78 通用,不需额外定义
非泛型接口包装 60 3.33 通用,需要额外定义并实现
动态生成的非泛型接口包装 72 4 通用,需要额外定义