尝试访问 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 的建议,检查类型 的通用参数。