【问题标题】:Reflected object access using a string使用字符串的反射对象访问
【发布时间】: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


【解决方案1】:

也许你应该看看FormatWith

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-12
    • 1970-01-01
    • 2018-05-21
    • 2018-01-24
    • 1970-01-01
    • 1970-01-01
    • 2021-09-01
    • 1970-01-01
    相关资源
    最近更新 更多