-4

私は .NET で逆シリアル化クラスに取り組んでいます。文字列に格納されている変数名を提供するメソッドを開発する必要があります。

次のような文字列があります。

string string_name = "this_is_going_to_be_var_name";

コードで this_is_going_to_be_var_name という名前の変数を動的に宣言するにはどうすればよいでしょうか?

明確にするために: 上位レベルのプログラマー/ユーザーの希望に応じて、PARENT TYPES を使用して入力として提供される文字列と同じ名前の変数を宣言する逆シリアル化クラスがあります。

例: javascript/jQuery で、リクエストを作成して JSON をフェッチすると、インタープリターは同じ名前の変数/配列を宣言し、それらに値を割り当てます。{"var_name":"var_value"} が JSON 文字列の場合、インタープリターは var_name という名前の変数を作成し、json_data_object.var_name などの「var_value」をそれに割り当てます。

4

4 に答える 4

5

いいえ、できません。C# 変数はすべて静的に宣言されます。

最善の方法は、辞書を作成し、変数名の代わりにキーを使用することです。

// Replace object with your own type
Dictionary<string, object> myDictionary = new Dictionary<string, object>();
myDictionary.Add("this_is_going_to_be_var_name", value_of_the_variable);
// ...
// This is equivalent to foo($this_is_going_to_be_var_name) in PHP
foo(myDictionary["this_is_going_to_be_var_name"]); 
于 2012-08-09T16:53:38.553 に答える
1

これは不可能です。変数名は実行時ではなくコンパイル時に定義されます。1 つの方法は、ディクショナリまたはハッシュ テーブルを作成して文字列名をオブジェクトにマップし、目的を達成することです。

于 2012-08-09T16:54:06.797 に答える
0

あなたが何を意味したのかわからない

私のコードは、 this_is_going_to_be_var_nameという名前の変数を動的に宣言しますか?

explodeしかし、 PHPで行うことの.Netバージョンは次のSplitとおりです。

string[] zz = "this_is_going_to_be_var_name".Split('_');
于 2012-08-09T16:53:39.610 に答える
0

現時点で考えられる唯一のこと (テストしていないので、可能かどうかはわかりません) は、動的タイプのオブジェクトを用意し、リフレクションと InvokeMember( を使用して実行時にフィールドを設定しようとすることです。 )、動的タイプのオブジェクトには検証がないため、これが機能する可能性を与えることができます。

更新: ExpendoObject でテストしましたが、InvokeMember は動作していないようです (少なくともデフォルトのバインダーでは動作しませんが、DynamicObject ではテストしていませんが、動作する可能性はあまりありませんが、まだ動作する可能性がありますDynamicObject の使用方法については、http://msdn.microsoft.com/en-us/library/ee461504.aspx を参照してください。

動的オブジェクトが IDictionary としてキャストされているメソッドを本質的に記述している ExpandoObject にプロパティを動的に追加する を見てください。その後、実際にオブジェクトのプロパティを取得している間に、標準の辞書アクセスを使用してプロパティを追加できます。 .

ExpendoObject 型の動的オブジェクトを使用してサンプル プロジェクトでテストした後、IDictionary 型を使用してそれを参照する別の変数を追加し、次の例のように両方のプロパティを設定および取得しようとしました。

dynamic test = new ExpandoObject(); 
//reference the object as a dictionary
var asDictinary = test as IDictionary<string, Object>;

//Test by setting it as property and get as a dictionary
test.testObject = 123;
Console.Write("Testing it by getting the value as if it was a dictionary");
Console.WriteLine(asDictinary["testObject"]);

//Test by setting as dictionary and get as a property
//NOTE: the command line input should be "input", or it will fail with an error
Console.Write("Enter the varible name, ");
Console.Write("note that for the example to work it should the word 'input':");
string variableName = Console.ReadLine();
Console.Write("Enter the varible value, it should be an integer: ");           
int variableValue = int.Parse(Console.ReadLine());
asDictinary.Add(variableName, variableValue);
Console.WriteLine(test.input);//Provided that the command line input was "input"

(ただし、あなたのケースでは、とにかくコードでプロパティに直接アクセスしないため、その必要性はわかりません。おそらく辞書を直接使用できるでしょう。なぜそれらが必要なのかわかりませんオブジェクトのプロパティ。コンパイル時にそれらを参照する場合にのみ必要です。

しかし、おそらく私はあなたを誤解しており、あなたは動的変数を探していて、動的プロパティ [$$ 構文を使用して PHP で利用できるもの] を探していません。その場合は、c# には変数がまったくないことに注意してください。すべてがオブジェクトにカプセル化されているため)。

詳細については、C# でクラスにフィールドを動的に追加する方法を参照することもできます。

于 2012-08-09T23:30:49.373 に答える