2013-10-08 146 views
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)。 考生:對象的invoke(對象,對象[])對象的invoke(對象,Reflection.BindingFlags,Reflection.Binder,對象[],CultureInfo的)

    我明白這是什麼意思,但怎麼能我調用Mapper.Map()傳遞參數TSource source而不是object

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

回答

0

首先是:你的意思是,我認爲,一個編譯器錯誤(發生在編譯時),而不是一個例外(發生在運行時)。設置一個repro,我收到你在編譯時間報價的消息。

接下來,問題1: 「我怎麼能調用Mapper.Map()」。如錯誤所述,您以不符合any of its possible signatures的方式致電MethodInfo.Invoke。你想要的超載是第一個(更簡單的)。

這裏,按照該文檔中,第一參數Invoke,是要調用的方法對象,或者爲你喜歡的靜態方法(你現在看到的那種),什麼(通常我們通過null來明確我們正在調用一個靜態方法)。

參數Invoke應該是一個陣列的object,含有的參數傳遞給該方法。這裏唯一的參數是source,但它仍然需要進入數組。

所以,你需要你的電話更改爲Invokemethod.Invoke(null, new object[]{source})

解決方法將我們帶到問題2:「我如何返回TTarget而不是object」。如果您對類型轉換錯誤在運行時失敗感到高興,這與演員陣容一樣簡單:

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

我們完成了。