动态对象的特殊字符?

时间:2013-05-08 15:41:47

标签: c# c#-4.0 expandoobject

我可以用来为动态对象创建属性的字符类型有任何限制吗?

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

2 个答案:

答案 0 :(得分:4)

假设你有:

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 */中所示)。

似乎对所用名称没有限制。字符串键似乎序数字符串比较进行比较,例如EqualityComparer<string>.DefaultStringComparer.Ordinal

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

答案 1 :(得分:3)

任何Unicode标准附件15字符(和下划线),如C# spec所说:

  

本节中给出的标识符规则完全符合Unicode标准附件15推荐的规则,但允许下划线作为初始字符(在C编程语言中是传统的),标识符中允许使用Unicode转义序列,允许使用“@”字符作为前缀,以便将关键字用作标识符。

要获取需要@前缀的字符列表,请查看HERE