2010-11-21 8 views
1

ファンクションパラメータリストをタプルに戻したり戻したりする便利で標準的な方法はありますか?ファンクションパラメータリストをタプルにキャストする方法

.NETのどこかに存在するこの「キャスト」操作は、言語レベルではなく(「関数パラメータリスト」などのタイプがないため)、リフレクションを使用して実現する必要があります。前方のケースでは、タプルフィールドを含む後方のケースコール関数で、(関数名によって)正確なTypeのタプルを返します。

タプルに関数のパラメータリストをパッキング/アンパックするのと同じように機能します。

タプルと関数のパラメータが両方とも非同種のリストであり、これは非常に自然な操作なので、何らかの形で可能でなければなりません。

追加: はい、これは言語では不可能ですが、これはリフレクションとスタックブラウジングを使用して可能です。

void Foo(int a, bool b, string c) 
{ 
    Tuple<int,bool,string> argsTuple = pack(); 
}         // ^^^^^^ 

:そのようなコードは、フレームワークに存在しない場合、私は、これはあなたがやりたいことならば、このようなことを行う世界でもそれらの5人:)

+0

多分私はあなたが何について話しているか分からないので、私はばかです。 –

+0

こんにちは、あなたはPythonのようなパラメータのパッキング/アンパックをしようとしていると思いますか?これはC#で(私が知る限り)ポーズできません。そしてC#では、コレクション(リスト)は同じ型からのものなので、同じコレクション(C#2.0)に別のデータ型を格納することはできません。 – SubniC

答えて

3

を見つけるために、実際には面白いです。 ..答えはではありません。は、メソッドの引数をタプルに変換することはできません。おそらくこれをリフレクションで行うことはできますが、.NET Frameworkが提供するものではありません。

逆に、関数のパラメータリスト—(つまりFoo(argsTuple) —)にタプルをアンパックすると、間違いなくC#でそれを行うことはできません。

+0

より良い:var args = GetCurrentCallParameters(); :) –

+0

これは、リフレクション(およびスタックブラウジング)を使用してのみ可能であることを知っています。しかし、これはフレームワーク内で既に完了しているかもしれません。 –

+0

@ローマン、私は "良い"は味に依存すると思います。私は通常、型について明示的ではありませんが、私のコード例では、何が起きるのかを示すために正確な 'Tuple'型を記述しています。これはBCLメソッドではなく、言語機能(この種の操作は通常、Pythonなどを参照)であることを示す小文字の 'pack'です。 – stakx

1

開梱は非常に簡単です。 拡張メソッドを作成することができます。

public static R Apply<T, U, R>(this Tuple<T, U> t, Func<T, U, R> f) 
{ 
    return f(t.Item1, t.Item2); 
} 

public static R Apply<T, U, V, R>(this Tuple<T, U, V> t, Func<T, U, V, R> f) 
{ 
    return f(t.Item1, t.Item2, t.Item3); 
} 

など。これはアクションに対しても実行できます。次に、これらの拡張メソッドを次のように使用できます。

tuple.Apply(Method) 
+0

はい、あなたはrigthです。開梱も簡単でどこかで実現できると私は期待していました。 (私は、コード生成の目的でこのような技を使用する考えがありました)。 –

関連する問題