1

2 つの型パラメーターを必要とするメソッドを呼び出そうとしていますが、そのうちの 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
}

2 つの質問があります。

  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) です。

    これが何を意味するかは理解できますが、引数 ofと notMapper.Map()を渡して呼び出すにはどうすればよいですか?TSource sourceobject

  2. TTargetによって返されるオブジェクトの代わりにどのように返すことができmethod.Invoke()ますか?

4

1 に答える 1

0

最初に: つまり、例外(実行時に発生) ではなく、コンパイラ エラー(コンパイル時に発生)だと思います。再現を設定すると、コンパイル時に引用したメッセージが表示されます。

次に、問題1:「どうすれば呼び出すことができますかMapper.Map()」。エラーが示すように、可能な署名のいずれともMethodInfo.Invoke一致しない方法で呼び出しています。必要なオーバーロードは、最初の (より単純な) オーバーロードです。

ここで、ドキュメントによると、 への最初のパラメータは でメソッドInvoke呼び出すオブジェクトです。または、静的メソッド (ここにある種類) の場合は、好きなものを渡します (明らかにするために渡すのが一般的です) 。静的メソッドを呼び出しています)。null

2 番目のパラメータは、メソッドに渡すパラメータを含む の配列Invokeある必要があります。ここで唯一のパラメーターは ですが、それでも配列に入れる必要があります。objectsource

Invokeしたがって、呼び出しをに変更する必要がありますmethod.Invoke(null, new object[]{source})

修正すると、問題 2 に進みTTargetますobject。型変換エラーが実行時に失敗しても問題ない場合、これはキャストと同じくらい簡単です。

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

これで完了です。

于 2013-10-09T09:15:57.323 に答える