动态对象的特殊字符?

Oli*_*ver 5 c# expandoobject c#-4.0

可用于为动态对象创建属性的字符类型是否有任何限制?

是否有我不能使用的字符列表(例如 /* @)?

Jep*_*sen 6

假设你有:

dynamic eo = new ExpandoObject();
Run Code Online (Sandbox Code Playgroud)

那么很明显,如果你通过C#语法扩展对象,你需要遵循C#规则,例如:

eo.ValidCSharpIdentifier = 42;
eo._OK = 42;
eo.æ = 42;
Run Code Online (Sandbox Code Playgroud)

但是,如果您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);
Run Code Online (Sandbox Code Playgroud)

正如我们所见,奇怪的标识符是可能的。但是字符串必须是对象,因此null不能使用引用(如.Add(null, 42) /* illegal */)。

这里似乎是上使用的名称没有限制。字符串键似乎有序字符串比较进行比较,例如 inEqualityComparer<string>.DefaultStringComparer.Ordinal

当然,与 C# 规则相比,某些 .NET 语言对名称中的有效字符有不同的规则。