【问题标题】:Use exceptional char (minus) in property name of anonymous type在匿名类型的属性名称中使用特殊字符(减号)
【发布时间】:2011-08-15 11:22:39
【问题描述】:

问题

我正在尝试使用名为 data-maxchars 的属性声明一个匿名类型。

因为减号是一个运算符,它会将我想要的属性名称降级(?)为一个操作,我得到一个编译错误:Invalid anonymous type member declarator.

我知道我可以使用 @ 转义保留字,但我不知道是否有任何方法可以转义减号。

object attributes = (object)new { @class = "foo" } // OK

起源

匿名类型作为object 参数传递给TextAreaExtensions.TextArea<%= Html.TextArea(Model.Field.Id, val, rows, cols, attributes)%>。这会生成一个带有交付属性的输入。

我想使用 JS 渐进增强来限制用户可以插入的字符数。
所以我在属性上使用了data- 前缀:http://ejohn.org/blog/html-5-data-attributes/

替代方案

  • 在写这篇文章时,我注意到有一个 overload 接受一个 IDictionary 而不是一个对象。
  • 我可以手写输入。
  • 我可以使用不同的前缀而忽略标准。 (嘘!)

但是如果有办法使用有趣的属性名称,我想学习它。

【问题讨论】:

  • 我认为你可以使用DynamicObject 来实现这一点,但它会增加不必要的开销。所以让我们等待大师。
  • 这也是我的想法,但为什么会造成不必要的开销?
  • @sternr:因为不幸的是 .NET DLR 比“静态”定义的类慢得多。除此之外,在 C# 中使用 DLR 类(与习惯类相比)会付出更多努力。
  • 我可能会遗漏一些东西,但是 C# 中的标识符根本不允许包含减号...private int data-maxchars; // <- invalid
  • @Daniel:这是 C# 的限制,但可能不是 .NET 运行时的限制。

标签: c# asp.net-mvc anonymous-types


【解决方案1】:

从 ASP.NET MVC 3 开始,您可以改用下划线 (_),它会自动替换为 - 以生成 HTML。魔术在HtmlHelper.AnonymousObjectToHtmlAttributes 中完成。

例如:new { data_abc = "def" } 将生成为data-abc="def"

【讨论】:

  • 对我来说似乎不是这样。也许你有不同的框架? (此处为 ASP.NET MVC。)
  • 似乎只是 ASP.NET MVC 3。在 MVC 2 中尝试过,但没有得到相同的结果。编辑我的帖子以反映这一点。
  • 举个例子:HtmlHelper.AnonymousObjectToHtmlAttributes(new { attr_a = "abc", attr_b = "def" })
【解决方案2】:

这根本不可能,除非您通过 Reflection.Emit 生成自己的类。但是你仍然需要为此传递一些“字典”,所以你不妨去那个。

使用 C# 3 集合初始值设定项应该会使它看起来更好。

【讨论】:

  • 你的意思是new Dictionary<string, object>(){ {"data-maxchars", 300} }?我同意。谢谢,这很有帮助。
【解决方案3】:

我可能会遗漏一些东西,但是 C# 中的标识符根本不允许包含减号...

private int data-maxchars; // <- invalid

【讨论】:

  • @ANeves:你觉得那里有什么有趣的地方?
  • 全面描述什么是允许的,什么是不允许的,以及在哪里。
  • @ANeves 没错。可以使用char.GetUnicodeCategory 静态方法检查字符。连字符、减号或破折号 - 是对应于类 PdDashPunctuation,这在 C# 规范中是不允许的。而下划线_则是ConnectorPunctuation,类Pc,在C#规范中称为connecting-character,是允许的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-20
相关资源
最近更新 更多