2016-10-12 5 views
0

私は、指定されたジェネリック型引数でそのような何かをのFunc型を作成したいのですが、一つだけの文もちろん指定したジェネリックタイプでfuncのタイプを作成するにはどうすればよいですか?

Type create_type(Type[] types) 
{ 
    return typeof(Func<>).MakeGenericType(types); // error if types.Length != 1 
    return typeof(Func<,>).MakeGenericType(types); // error if types.Length != 2 
    return typeof(Func<,,>).MakeGenericType(types); // error if types.Length != 3 
    return typeof(Func<,,,>).MakeGenericType(types); // error if types.Length != 4 
// .... 
} 

で、私はauxuliary配列を作成することができます

var func_types = new Type[] { typeof(Func<>), typeof(Func<,>) , //...} 

しかし、このソリューションを

注:配列の型は長くても(最大15)、私は優雅な解決策を見つけたいと思っています。残念ながら、別の言語で書かれたメタデータからそのような型を作成しています。

答えて

3

あなたがここに

Expression.GetFuncType(Type[] types) 

Expression.GetActionType(Type[] types) 

さらに情報が必要です何exaclty行うのFuncとアクションのためのExpressionクラスの静的メソッドがあります

GetFuncType

GetActionType

+0

華麗な答えです! – LmTinyToon

+1

その後、私は上記の醜いコードが必要であるという上記のコメントをすべて撤回します:)それは、誰がその醜いコードまたは畳み込まれたコードを書く必要があるのだろうという疑問を引き起こします - https://referencesource.microsoft.com/#System.Core/Microsoft /Scripting/Compiler/DelegateHelpers.Generated.cs,227 –

+0

@CSharpie、そのようなタプル型のメソッドのいくつかの類似点はありますか? – LmTinyToon

1

generic型はT`Nという形式の名前を持ちます。ここで、Nは汎用パラメータの数です。だから、すべてのFunc代表団は、私たちは簡単にタイプを取得することを可能にする体系的な名前があります。これはどのように効率的によう

Type create_type(Type[] types) { 
    return Type.GetType($"System.Func`{types.Length}").MakeGenericType(types); 
} 

ない約束をしていますが、実行時に、このようなタイプを構築している場合、それはおそらく最大の関心事ではありませんとにかくExpression.GetFuncTypeの存在を考えると


、この答えは、もちろん悪いですが、私は(ある種の)教育目的のためにそれを残しています。これにより、9個以上の引数を持つSystem.Func代理人がSystem.Coreに存在し、mscorlibに存在しないため、9個の引数を超えて動作しなくなり、アセンブリに修飾された名前が必要になります。修正は簡単です(小切手を入れて、名前にSystem.Coreを条件付きで追加しますが、GetFuncTypeの存在を条件として不要です)。

関連する問題