2010-08-31 57 views
1

在C#我想要创建一个通用的方法:C#通用方法+反射问题

  1. 接受一个MethodInfo对象作为参数。
  2. 返回调用MethodInfo时返回的对象。

我混乱的根源是,我想的方法被统称键入相同的返回类型为MethodInfo对象是被传入。

回答

2

你不能做到这一点。根据定义,泛型是编译时构造,而特定的返回类型是只在运行时才知道的(当您收到特定的MethodInfo实例时),并且会随呼叫而改变。

+0

我不知道,如果只是说这不可能是公平的。例如,你可以创建一个包装器MethodInfo ,它确保它返回类型T的一个对象,并且因此仍然受益于编译时泛型(只要你的用例至少可以确保你在编译时知道T)。 – 2013-03-22 20:57:20

+0

该问题要求该方法采用'MethodInfo'的实例,而不是其他类型的实例。这是有道理的,因为'MethodInfo'是你从Reflection得到的。当然,如果你确实知道它将在编译时返回的类型,你可以用一个转换来包装它,但是这首先打破了所有这些目标。 – 2013-03-25 21:06:52

+0

那么,我在设想一个想要做这件事的场景时遇到了麻烦,并且在编译时不知道返回类型 - 如果您不这样做,那么首先对泛型没有任何好处。如果你这样做,那么在例如扫描程序集的用例中找到匹配特定格式(包括返回类型)的方法并将它们聚合为MethodInfo对象,例如作为模板库的一部分。 – 2013-03-25 22:52:52

1

帕维尔Minaev是正确的,

我在这种情况下(当然我不知道整个上下文)的建议是使用返回动态类型,当然是不会被类型化的方法。

​​

或者因为你知道什么是返回类型,把在方法调用:

public T MyMethod<T>(MethodInfo methodInfo) 
当然,你的方法映射转换内部麻烦谈婚论嫁的

。 但你也可以使用lambda,就像放在一个参数转换:

public T MyMethod<T>(MethodInfo methodInfo, Func<object, T> conversion) 

我认为方法的调用会很清晰,如:

Console.WriteLine(MyMethod(methodInfo, (a) => Convert.ToString(a)));