我需要从工厂委托(Func<object
)获取通用参数类型,但它总是会产生IndexOutOfRangeException
。
public void Bind(Type service, Func<object> factory) {
var factoryResultType = factory.Method.GetGenericArguments()[0]; // ex
}
// extension
public static void Bind<TService>(this IBinder binder, Func<TService> factory)
where TService : class
{
binder.Bind(typeof(TService), (Func<object>) factory);
}
// usage
var dummyClass = new DummyClass();
binder.Bind<IDummy>(() => dummyClass);
答案 0 :(得分:1)
如果我理解你的代码,你想在调用时提供类型:
binder.Bind<IDummy>(() => dummyClass);
是IDummy。 如果是这样的话:在你的Bind方法中使用这个代码:
var factoryResultType = factory.GetType().GetGenericArguments()[0];
Func委托的Method属性将返回MethodInfo,该方法不是泛型方法。但是返回一种特定类型的那个。 你只能从Func委托自己获得泛型参数。
答案 1 :(得分:1)
代理Func<T>
被编译为以下内容:
public class Func<T>
{
public T Invoke() { /* ... */ }
}
MethodInfo
返回的factory.Method
代表上述Invoke
方法。如您所见,此方法不泛型,这就是您的代码失败的原因。
您可以检查其返回类型:
var type = f.Method.ReturnType;
或者,正如@sszarek建议的那样,检查类型的通用参数。