2009-09-21 72 views
1

我觉得我非常接近解决这个问题,并阅读了大量文章和现有问题。使用参数安全调用多次调用通用方法(运行时返回类型)的最佳方法

我有这样的方法:

public T DoStuff(object arg1, object arg2) 
{ 
    /* Do stuff and return a T */ 
} 

,我需要能够将此方法传递给另一个类回调的目的。
但是,当这个其他类回调时,它将使用只在运行时才知道的不同预期返回类型。

例如为:

public void SomeMethod(MethodInfo m, ref object caller) 
{ 
    MethodInfo callback = m.MakeGenericMethod(new Type[] { runtimeType }); 
    callback.Invoke(caller, new [] { arg1val, arg2val }); 
} 

/* DoStuff() will make a call to SomeMethod() passing 
* itself (the method and the object) */ 

然而,代替此,我想能够

  1. 通行证仅单个回调对象(即一个委托或函数功能<>)来的someMethod。
  2. 能够为通用调用适当地修改此对象。
  3. 具有类型安全参数的呼叫,因为我会用代理/ Func <>。

我已经找到适合每个人的方法,但没有涵盖所有这些方法。

这可能吗?

回答

5

MakeGenericMethod使用,我认为方法(在你的例子)是通用在T

public T DoStuff<T>(object arg1, object arg2) 

由于反射你正在做的量,这简直就不是做你任何好处;从反射使用你还不如用:

public object DoStuff(Type type, object arg1, object arg2) 

和使用(例如)Activator.CreateInstance(type)创建一个实例。上面现在可以与代表一起使用;例如Func<Type,object,object,object>

+0

是的,你是对的,好点。我觉得肮脏使用这种反射,但我看不到另一种将数据运行时解析为任意代码对象的方式。有一段时间我很担心调用其他泛型方法,因为我不会有一个实际的“T”类型来工作,但看到我正在通过反射来调用它们,这不是一个大问题,它们甚至可能是以类似的方式重写。谢谢! – 2009-09-21 18:43:43