1

複数の変数に値を割り当てることができるmakeメソッドを取得しようとしています。変数がいくつあるかはわかりませんが、そのタイプはわかっています。ただし、変数はすべて異なるタイプにすることができます。

私はこれについてかなりグーグルで検索しましたが、これはマネージコードでは実行できないと確信しています。(私が間違っている場合は私を訂正してください)

安全でないコードについてはよくわかりません(読んでください:何でも)。それはそのように行うことができますか?たぶん、初期化したい変数へのポインターの配列を渡して、そのようにしますか?

私は基本的に、任意の数の混合型変数をメソッドに渡し、メソッド内でそれらの値を割り当てる方法を探しています...それは空のパイですか?

編集1:

これが私が達成したいことを説明することを望むいくつかのコードです:

private void SomeMethod()
{
    string a = string.empty;
    int b = 0;
    double c = 0;

    object[] testObject = new object[] { b, c };

    SetVariables(ref testObject);
}

public static void SetVariables(ref object[] Variables)
{
    for (int i = 0; i < Variables.Length; i++)
        Variables[i] = // The value the variable needs to have
}

実行後SetVariables、a、b、cは次のようになります。

a = "Some text"
b = 123
c = 1564.653

SetVariablesにパラメーターとして渡された変数にアクセスし、それらの値を変更する方法を探しています。それはメモリ内のそれらの保存場所にアクセスすることを意味すると思います、それで私はポインタが必要かもしれないと思いますか?

編集2:

ここでの私の質問は、私がこれを行おうとしている状況をよりよく示すはずです。

割り当てたい変数のstring、int、double、boolなどの基本的な型のみを扱います。

私が割り当てているデータはテキスト形式であり、フィールドの数は可変です。各フィールドは、変数が渡される順序で入力変数の1つにマップする必要があります。順序が一致しない場合は、せいぜい誤割り当てまたは最悪の場合は型エラーが発生しますが、作成するのはユーザーの責任です。変数がデータと一致することを確認してください。

4

3 に答える 3

1

あなたがやろうとしていることは、C#ではうまく機能しません。それは実際には言語のことであり、「管理されたものと管理されていないもの」ではありません。

サンプルコードでは、2つの変数があることがわかっているため、通常はそれほど多くは発生しません。それらを配列に入力するには、それらを入力する必要がありました。

異なる数のパラメーターを使用してコード内の多くの場所から呼び出される場合SetVariables()は、メソッドのオーバーロードを大量に作成できます(1つのパラメーター、2つのパラメーター、3つのパラメーターなど)。

しかし、正直に言うと、通常、このケースに遭遇したのは、賢明でない方法で何かをしているためです。

それについてもっと考えてみると、次のようになります。

Variables[i] = // The value the variable needs to have

このシナリオで機能することが期待されます。任意の変数は任意のタイプである可能性があるため、どのように設定するかを知ることができますか?b, cまた、呼び出しを変数の受け渡しから逆にするように変更した場合、変数の割り当てが台無しになるのを防ぐにはどうすればよいc, bですか?

論理的には、それはバラバラになり始めます。

私が言おうとしているのは、C#はそれをあまりサポートしていないということですが、ほとんど意味がないため、通常はサポートする必要はありません。


とにかく実用的な解決策を考えようとしています。SetVariables値を返すだけで、パラメーターは取り込めません。変数を割り当てるのは他の関数の仕事です。タイプを知る必要がある場合は、タイプを渡すだけです。

public object[] GetValues(params Type types)
{
    var result = new object[types.length];
    for (int i = 0; i < types.length; i++)
    {
        if(types[i] == typeof(string))
            result[i] = "foo";
        if(types[i] == typeof(int))
            result[i] = -1;
    }
    return result;
}

public void DoStuff()
{
    var data = GetValues(typeof(string), typeof(int), typeof(string));
    string foo1 = (string)data[0];
    int someNumber = (int)data[1];
    string foo2 = (string)data[2];
}

その醜いですが、それは動作します...

于 2012-11-08T01:43:50.333 に答える
1

これは、この回答を同様の質問に適合させた例です。残念ながら、問題を解決するのは少し難しく、あなたが望むことを達成するための簡単な方法は実際にはありません。

private static void SomeMethod() {
    string a = string.Empty;
    int b = 0;
    double c = 0;

    SetVariables(x => a = (string)x
               , x => b = (int)x
               , x => c = (double)x);

    Console.WriteLine("a: {0}\nb: {1}\nc: {2}", a, b, c);
}

public static void SetVariables(params Action<object>[] setters) {
    var tokens = new object[] { "Hello", 10, 14.235 };
    for (int i = 0; i < setters.Length; i++)
        setters[i](tokens[i]); // Assumed this is read and initialized properly
}

これには少し臭いがあることは認めますが、実際には可変入力を考慮する必要があるため、過度の複雑さを追加することなく、必要なものに近づける必要があります。

于 2012-11-08T02:06:34.953 に答える
0

あなたは自分で答えにかなり近いと思います。変数に割り当てられた値がその型にのみ基づいていると仮定すると、上記のコードを使用すると仮定すると、forループ中に値の型をtypeof()チェックと比較できます。

if(Variables[i].GetType() == typeof(int)){
    //...do stuff
}

//etc...until you have an if for each data type you expect you might find

ここにタイプのドキュメントへのリンクがあります

参照型の使用方法を見たことがあると思いますが、念のためここを見てください

于 2012-11-08T01:40:00.943 に答える