【发布时间】:2015-07-17 15:42:35
【问题描述】:
考虑如下通用方法:
class SomeClass
{
public static void SomeMethod<T>(Func<T>);
}
我想使用反射来调用这个方法。这是我能做到的:
_SomeMethod = typeof(SomeClass).GetMethod("SomeMethod",
BindingFlags.Public | BindingFlags.Static);
Type type = typeof(SomeType); //Actually SomeType is extracted using reflection and it's not fixed
MethodInfo toBeCalled = _SomeMethod.MakeGenericMethod(type);
object obj = Activator.CreateInstance(type);
toBeCalled.Invoke(null, () => obj);
但它给出了编译错误:
Error CS1660: Cannot convert `lambda expression' to non-delegate type `object' (CS1660)
这是绝对可以接受的,但有什么解决方法?
请记住,使用 lambda 创建的 closure 是我需要的,所以不要删除它。
[更新]
澄清情况以使其有意义;使用 lambda 创建的仿函数是 SomeMethod 用于创建类 SomeType 的实例的实例化器。但我不想在仿函数中实际创建对象,而是从之前的实例化对象集合中返回它。最简单的方法是将 obj 放在 lambda 返回的闭包中,你不觉得吗?
【问题讨论】:
-
那么
obj的类型是什么?如果您不知道所涉及的T,则很难了解如何从 lambda 表达式创建Func<T>。您总是只返回一个常量值,还是有时会有其他 lambda 表达式?更多信息会很有帮助。 -
@JonSkeet 我已经更新了问题
-
但是您想创建一个始终只返回
obj的Func?没有比这更复杂的了吗?你说你想保持关闭 - 这是否意味着你要在之后更改obj的值?同样,更清晰会非常有帮助。 -
我们可以更改
SomeMethod()吗? -
@JamesCurran 不,实际上
SomeMethod属于一个库,不是我写的!
标签: c# generics reflection lambda closures