尝试访问Func <object>委托的泛型参数时的IndexOutOfRangeException

时间:2015-04-28 07:35:19

标签: c# .net generics reflection

我需要从工厂委托(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);

2 个答案:

答案 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建议的那样,检查类型的通用参数。