动态对象的特殊字符

本文关键字:特殊字符 对象 动态 | 更新日期: 2023-09-27 18:12:34

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

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

动态对象的特殊字符

假设有:

dynamic eo = new ExpandoObject();

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

eo.ValidCSharpIdentifier = 42;
eo._OK = 42;
eo.æ = 42;

但是如果您通过转换为IDictionary<,>来扩展eo,那么您可以使用其他字符:

((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语言对名称中的有效字符有不同的规则。

任何Unicode标准附件15字符(和下划线),如c#规范所述:

本节给出的标识符规则与Unicode标准附件15推荐的规则完全对应,除了允许下划线作为初始字符(在C编程语言中是传统的),允许在标识符中使用Unicode转义序列,并且允许"@"字符作为前缀以启用关键字作为标识符。

需要以@作为前缀的字符列表,请查看此处