私のC#アプリケーションでは、ユーザーにタプルを表示する必要があります。問題は、タプルはどのような形式でもかまいません。コンパイル時にタプルがどのように見えるかわからないので、実行時にそれを表示するためにイントロスペクトする必要があります。第1の問題は、タプル内の各コンポーネントのタイプを識別することであり、第2の問題は各コンポーネントの値を取得することです。タプルのC#ランタイムイントロスペクション
各コンポーネントの値を取得するには、Item1、Item2などが含まれているようですが、インデックスでアイテムを取得する方法はありますか?現在、私のコードは、コンポーネントがどのように反復処理されるかを決定するためにコンポーネントの数を使用する必要があるため、本当に厄介です(下記参照)。しかし、もっと大きな問題は、Tupleオブジェクトを取得する方法がわからないために要素を取得する方法です。次のコードがコンパイルされますが、実行時にオブジェクトのTupleへのキャストによってこの形式のエラーがスローされます。
[System.Tuple 2[System.String,System.Byte[]]' to type 'System.Tuple
2 [System.Object、System.Object]]のオブジェクトをキャストすることができません。
キャストに失敗したように見えますが(なぜならわかると思いますが)、キャストを書き直す方法はわかりません。私は次のようなものを試しました:
object rowObject = ((Tuple<tupleTypeArray[0], tupleTypeArray[1]>)tupleObject).Item1;
これはコンパイルされません。助けていただければ幸いです!
tupleObject = SomeTupleGotFromMethodCall();
Type tupleType = tupleObject.GetType();
Type[] tupleTypeArray = tupleType.GenericTypeArguments;
int tupleLength = tupleType.GenericTypeArguments.Count<Type>();
for (int i = 0; i < tupleLength; i++)
{
if (tupleLength == 1)
{
if (i == 0)
{
Type firstType = tupleTypeArray[0];
object rowObject = ((Tuple<object>)tupleObject).Item1;
if (rowObject != null)
{
display(rowObject);
}
}
}
if (tupleLength == 2)
{
if (i == 0)
{
object rowObject = ((Tuple<object, object>)tupleObject).Item1;
if (rowObject != null)
{
display(rowObject);
}
}
if (i == 1)
{
object rowObject = ((Tuple<object, object>)tupleObject).Item2;
display(rowObject);
}
}
...
}
リストとしてタプルを使用しては決して良いアイデアのようなものです、あなたはタプルを返す、あなたのメソッドの実装を持っているのですか? – Boo
いいえ - 私は戻ってくるものを支配しません。これは別のライブラリです。上記のコードに達する前に、タプルだけが戻って来る(そして私はこれらの他の型を扱う)唯一のオブジェクトではありません。 – user304582
最初の2つの行が意味をなさないので、最初のすべての 'オブジェクト'は型です。 – Boo