尝试访问 Func<object> 委托的通用参数时出现 IndexOutOfRangeException
IndexOutOfRangeException when trying to access the generic arguments of a Func<object> delegate
我需要从工厂委托 (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);
如果我理解你的代码是正确的,你希望在调用时获得类型:
binder.Bind<IDummy>(() => dummyClass);
这是IDummy。
如果是这样:在您的 Bind 方法中使用此代码:
var factoryResultType = factory.GetType().GetGenericArguments()[0];
Func 委托的方法 属性 将为非泛型方法的方法 return MethodInfo。但是 return 是一种特定类型。
您只能从 Func 委托本身获取通用参数。
一个委托 Func<T>
被编译成类似这样的东西:
public class Func<T>
{
public T Invoke() { /* ... */ }
}
由factory.Method
编辑的MethodInfo
return表示上面的Invoke
方法。如您所见,此方法 不是 通用方法,这就是您的代码失败的原因。
您可以改为检查其 return 类型:
var type = f.Method.ReturnType;
或者,按照@sszarek 的建议,检查类型 的通用参数。
我需要从工厂委托 (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);
如果我理解你的代码是正确的,你希望在调用时获得类型:
binder.Bind<IDummy>(() => dummyClass);
这是IDummy。 如果是这样:在您的 Bind 方法中使用此代码:
var factoryResultType = factory.GetType().GetGenericArguments()[0];
Func 委托的方法 属性 将为非泛型方法的方法 return MethodInfo。但是 return 是一种特定类型。 您只能从 Func 委托本身获取通用参数。
一个委托 Func<T>
被编译成类似这样的东西:
public class Func<T>
{
public T Invoke() { /* ... */ }
}
由factory.Method
编辑的MethodInfo
return表示上面的Invoke
方法。如您所见,此方法 不是 通用方法,这就是您的代码失败的原因。
您可以改为检查其 return 类型:
var type = f.Method.ReturnType;
或者,按照@sszarek 的建议,检查类型 的通用参数。