動的オブジェクトのプロパティを作成するために使用できる文字の種類に制限はありますか?
使用できない文字のリストはありますか (例: / * @)?
あなたが持っていると仮定します:
dynamic eo = new ExpandoObject();
明らかに、C# 構文を使用してオブジェクトを展開する場合は、C# の規則に従う必要があります。次に例を示します。
eo.ValidCSharpIdentifier = 42;
eo._OK = 42;
eo.æ = 42;
ただし、eo
にキャストして展開するとIDictionary<,>
、他の文字を使用できます。
((IDictionary<string, object>)eo).Add("NotValidC#Identifier", 42);
((IDictionary<string, object>)eo).Add("42", 42);
((IDictionary<string, object>)eo).Add("/", 42);
((IDictionary<string, object>)eo).Add("*", 42);
((IDictionary<string, object>)eo).Add("@", 42);
((IDictionary<string, object>)eo).Add("", 42);
ご覧のとおり、奇妙な識別子が可能です。ただし、文字列はオブジェクトでなければならないため、null
参照は使用できません ( のように.Add(null, 42) /* illegal */
)。
使用する名前に制限はないようです。文字列キーは、 orのような序数の文字列比較と比較されるようです。EqualityComparer<string>.Default
StringComparer.Ordinal
確かに、一部の .NET 言語では、C# の規則と比較して、名前に含まれる有効な文字の規則が異なります。
C# 仕様にあるように、Unicode Standard Annex 15 文字 (およびアンダースコア) :
このセクションで示す識別子の規則は、Unicode 標準付属書 15 で推奨されている規則と正確に対応していますが、先頭文字としてアンダースコアが許可されていること (C プログラミング言語で伝統的であるように)、Unicode エスケープ シーケンスが識別子で許可されていること、および「@」文字は、キーワードを識別子として使用できるようにするためのプレフィックスとして使用できます。
接頭辞が必要な文字のリストについては、@
こちらをご覧ください。