【发布时间】:2011-06-20 09:49:26
【问题描述】:
我想只使用一个字符串来访问一个通用对象。我知道通过反射可以访问通用对象,所以我需要正确解析字符串表达式,提取对象访问令牌,并使用反射执行它们。
看起来很简单,但是我发现表达式解析的困难,因为正则表达式。
我的最终目标应该是基于对象属性的字符串渲染。一个例子是DebuggerDisplayAttribute,它允许通过访问一个对象来产生一个字符串。 我没有发现任何对执行字符串处理有用的东西;所以我开始使用正则表达式手动解析表达式字符串。
比如下面这个表达式就很简单了:
"MyFixedString = {PropertyName}"
因此,包含在“{ ... }”中的标记表示对象属性。提取属性名,通过反射获取值,调用ToString()方法,替换到表达式字符串上得到结果。
但我喜欢执行更复杂的对象访问:
"MyFixedString = {Property.Method(\"MyMethodArg.1\", \"MyMethodArg.2\").Field}"
当然,我知道对象访问由点分隔(但这并不简单,因为点可能存在于其他元素(即方法参数)中。此外,我需要识别方法、字段/属性、索引属性.
遗憾的是,我缺少正则表达式基础知识(我发誓我会研究它们!)。
所以,我的问题是:是否有一些内置类可以满足我的需要?如果不是,我需要一个正则表达式,将输入字符串按单个字符(在我的情况下是点和逗号)分割,但在字符用双引号括起来的情况下不要分割。
最后一个例子会被分割成
- 财产
- 方法(\"MyMethodArg.1\", \"MyMethodArg.2\")
- 方法
- "MyMethodArg.1\"
- \"MyMethodArg.2\"
- 字段
【问题讨论】:
-
正则表达式令人担忧。如果参数之一是
\"Hello, world!\",则以逗号分隔参数的正则表达式将变得非常混乱。 -
事实上我要求一个正则表达式,它用一个不被单引号/双引号括起来的单个字符分割字符串。
标签: c# regex reflection