1

我正在尝试调用一个需要两个类型参数的方法,其中一个在运行时之前是未知的。

public static TTarget Map<TSource, TTarget>(TSource source, string key) {
    var typeMapping = TypeMapper.mappings.FirstOrDefault(m => m.Key == key);
    if (typeMapping.Value == null) return null;

    Type type = Type.GetType(typeMapping.Value.ToString());
    if (type == null) return null;

    var method = typeof(Mapper).GetMethod("Map").MakeGenericMethod(typeof(TSource), type);
    return method.Invoke(source); // throws exception
}

我有两个问题:

  1. 我正在使用 AutoMapper,所以Mapper.Map<TSource, TDestination>(TSource source)我试图调用的方法也是如此,但是在调用时method.invoke(source)我得到了异常

    无法解析方法调用(TSource)。候选对象是: object invoke(object, object[])object invoke(object, Reflection.BindingFlags, Reflection.Binder, object[], CultureInfo)

    我明白这意味着什么,但我怎样才能调用Mapper.Map()传递TSource sourceand not的参数object

  2. 如何返回TTarget而不是返回的对象method.Invoke()

4

1 回答 1

0

首先:我认为您的意思是编译器错误(发生在编译时)而不是异常(发生在运行时)。设置复制,我收到您在编译时引用的消息。

接下来,问题1:“我如何调用Mapper.Map()”。正如错误所述,您调用的方式与其任何可能的签名MethodInfo.Invoke都不匹配。您想要的重载是第一个(更简单)的。

在这里,根据文档,第一个参数Invoke, 是调用方法的对象或者,对于静态方法(你在这里得到的那种),你喜欢的任何东西(通常传递null以使我们很明显'正在调用静态方法)。

第二参数Invoke应该是一个数组object包含要传递给方法的参数。这里唯一的参数是source,但它仍然需要放入一个数组中。

因此,您需要将呼叫更改为Invoketo method.Invoke(null, new object[]{source})

解决这个问题会将我们带到问题 2:“我怎样才能返回TTarget而不是object”。如果您对类型转换错误在运行时失败感到高兴,这就像强制转换一样简单:

return (TTarget)method.Invoke(null, new object[]{source});

我们完成了。

于 2013-10-09T09:15:57.323 回答