结论:
以下是测试代码:
None.gifusing System;
None.gif
using System.Collections.Generic;
None.gif
using System.Reflection;
None.gif
using System.Text;
None.gif
None.gif
namespace GenericMethodTest
ExpandedBlockStart.gifContractedBlock.gif
dot.gif{
InBlock.gif    
// 为泛型方法定义的委托
InBlock.gif
    public delegate void GM<T>(T obj, IList<T> list);
InBlock.gif
InBlock.gif    
// 为非泛型方法定义的接口
InBlock.gif
    public interface ING
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        
void NGM(object obj, object list);
ExpandedSubBlockEnd.gif    }

InBlock.gif
InBlock.gif    
class Program
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        
static void Main(string[] args)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            List
<int> list = new List<int>();
InBlock.gif            System.Diagnostics.Stopwatch watch 
= new System.Diagnostics.Stopwatch();
InBlock.gif            watch.Reset();
InBlock.gif            watch.Start();
InBlock.gif            
for (int i = 0; i < 1000000; i++)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                list.Add(i);
ExpandedSubBlockEnd.gif            }

InBlock.gif            watch.Stop();
InBlock.gif            
long l1 = watch.ElapsedMilliseconds;
InBlock.gif            watch.Reset();
InBlock.gif            watch.Start();
InBlock.gif            GM
<int> gm = new GM<int>(Program.Add);
InBlock.gif            
for (int i = 0; i < 1000000; i++)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                gm(i, list);
ExpandedSubBlockEnd.gif            }

InBlock.gif            watch.Stop();
InBlock.gif            
long l2 = watch.ElapsedMilliseconds;
InBlock.gif            watch.Reset();
InBlock.gif            watch.Start();
InBlock.gif            MethodInfo mi 
= typeof(Program).GetMethod("Add");
InBlock.gif            MethodInfo gmi 
= mi.MakeGenericMethod(typeof(int));
InBlock.gif            
for (int i = 0; i < 1000000; i++)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
ExpandedSubBlockStart.gifContractedSubBlock.gif                gmi.Invoke(
nullnew object[] dot.gif{ i, list });
ExpandedSubBlockEnd.gif            }

InBlock.gif            watch.Stop();
InBlock.gif            
long l3 = watch.ElapsedMilliseconds;
InBlock.gif            watch.Reset();
InBlock.gif            watch.Start();
InBlock.gif            ING ng1 
= GetNGC(typeof(int), typeof(Program), "Add");
InBlock.gif            
for (int i = 0; i < 1000000; i++)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                ng1.NGM(i, list);
ExpandedSubBlockEnd.gif            }

InBlock.gif            watch.Stop();
InBlock.gif            
long l4 = watch.ElapsedMilliseconds;
InBlock.gif            watch.Reset();
InBlock.gif            watch.Start();
InBlock.gif            ING ng2 
= InterfaceGenerator.GetInterface<ING>(new GM<int>(Program.Add));
InBlock.gif            
for (int i = 0; i < 1000000; i++)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                ng2.NGM(i, list);
ExpandedSubBlockEnd.gif            }

InBlock.gif            watch.Stop();
InBlock.gif            
long l5 = watch.ElapsedMilliseconds;
InBlock.gif            Console.WriteLine(
"{0}\n{1} vs {2} vs {3} vs {4} vs {5}", list.Count, l1, l2, l3, l4, l5);
InBlock.gif            Console.ReadLine();
ExpandedSubBlockEnd.gif        }

InBlock.gif
InBlock.gif        
public static void Add<T>(T obj, IList<T> list)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            list.Add(obj);
ExpandedSubBlockEnd.gif        }

InBlock.gif
InBlock.gif        
static ING GetNGC(Type genericType, Type methodType, string methodName)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            MethodInfo mi 
= methodType.GetMethod(methodName);
InBlock.gif            MethodInfo gmi 
= mi.MakeGenericMethod(genericType);
InBlock.gif            Delegate gmd 
= Delegate.CreateDelegate(typeof(GM<>).MakeGenericType(genericType), gmi);
InBlock.gif            
return Activator.CreateInstance(typeof(GClass<>).MakeGenericType(genericType), gmd) as ING;
ExpandedSubBlockEnd.gif        }

ExpandedSubBlockEnd.gif    }

InBlock.gif
InBlock.gif    
public class GClass<T> : ING
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        
private GM<T> m_gmd;
InBlock.gif
InBlock.gif        
public GClass(GM<T> gmd)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            m_gmd 
= gmd;
ExpandedSubBlockEnd.gif        }

InBlock.gif
ContractedSubBlock.gifExpandedSubBlockStart.gif        
INGClass 成员#region INGClass 成员
InBlock.gif
InBlock.gif        
public void NGM(object obj, object list)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            m_gmd((T)obj, (IList
<T>)list);
ExpandedSubBlockEnd.gif        }

InBlock.gif
ExpandedSubBlockEnd.gif        
#endregion

ExpandedSubBlockEnd.gif    }

ExpandedBlockEnd.gif}

None.gif
测试结果:
方案耗时比对其他优点
直接调用181不通用
泛型委托包装432.39不通用
反射16538918.78通用,不需额外定义
非泛型接口包装603.33通用,需要额外定义并实现
动态生成的非泛型接口包装724通用,需要额外定义