2009-03-18 9 views
15

ランタイムの作成

object GetFactory(Type type); 

この方法はtypeparam「T」が「タイプ」のFuncある<T>を返す必要があります。

だから、私の問題は、私はのFunc <を作成する方法がわからないということですか?リフレクションを使用して実行時に>代理人にコンストラクタがないため、Activator.CreateInstanceは機能しません。

すべてのアイデア?

答えて

23

あなたが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のオーバーロードがあります。

+0

マーク、私は実際にTが何であるかは分かりません。 Tが何であるか分かっていれば、これは簡単だろう。 –

+0

非一般的な方法の意味ですか?私は更新します... –

+0

私は問題をより良い状態に変更しました。 –

0

私はいつものアプローチは「ダム」バージョンがruntmeになりすます事も作り、その後、その上に、タイプセーフなバージョンを提供するために、ヘルパー拡張メソッドを提供することだと思います。

+0

これはIoCコンテナの中にあり、要求されたものがFunc (それはUriまたは文字列である可能性があります)であることを必ずしも知らずに、オブジェクトを強く型付けされた依存関係として返す必要があります。 –

0

funcではなくExpressionオブジェクトを作成し、式をコンパイル()してFuncデリゲートを取得することができます。

関連する問題