object GetFactory(Type type);
この方法はtypeparam「T」が「タイプ」のFuncある<T>を返す必要があります。
だから、私の問題は、私はのFunc <を作成する方法がわからないということですか?リフレクションを使用して実行時に>代理人にコンストラクタがないため、Activator.CreateInstanceは機能しません。
すべてのアイデア?
object GetFactory(Type type);
この方法はtypeparam「T」が「タイプ」のFuncある<T>を返す必要があります。
だから、私の問題は、私はのFunc <を作成する方法がわからないということですか?リフレクションを使用して実行時に>代理人にコンストラクタがないため、Activator.CreateInstanceは機能しません。
すべてのアイデア?
あなたがMethodInfo
からDelegate.CreateDelegate
、すなわちを使用します。以下、私はハードコードされましたが、あなたが実際の作成方法を取得するために、いくつかのロジック、またはExpression
を使用します。非staticメソッドの場合
using System;
using System.Reflection;
class Foo {}
static class Program
{
static Func<T> GetFactory<T>()
{
return (Func<T>)GetFactory(typeof(T));
}
static object GetFactory(Type type)
{
Type funcType = typeof(Func<>).MakeGenericType(type);
MethodInfo method = typeof(Program).GetMethod("CreateFoo",
BindingFlags.NonPublic | BindingFlags.Static);
return Delegate.CreateDelegate(funcType, method);
}
static Foo CreateFoo() { return new Foo(); }
static void Main()
{
Func<Foo> factory = GetFactory<Foo>();
Foo foo = factory();
}
}
を、ターゲット・インスタンスを受け入れDelegate.CreateDelegate
のオーバーロードがあります。
私はいつものアプローチは「ダム」バージョンがruntmeになりすます事も作り、その後、その上に、タイプセーフなバージョンを提供するために、ヘルパー拡張メソッドを提供することだと思います。
これはIoCコンテナの中にあり、要求されたものがFunc
funcではなくExpressionオブジェクトを作成し、式をコンパイル()してFuncデリゲートを取得することができます。
マーク、私は実際にTが何であるかは分かりません。 Tが何であるか分かっていれば、これは簡単だろう。 –
非一般的な方法の意味ですか?私は更新します... –
私は問題をより良い状態に変更しました。 –