Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 匿名类成员中的破折号(-)_C#_.net_.net 3.5 - Fatal编程技术网

C# 匿名类成员中的破折号(-)

C# 匿名类成员中的破折号(-),c#,.net,.net-3.5,C#,.net,.net 3.5,可以在匿名类的成员名称中使用破折号(-)吗?我主要感兴趣的是使用asp.net mvc将自定义属性传递给html助手,因为我希望我的html通过html5验证,这从数据开始 不起作用的示例: <%=Html.TextBoxFor(x => x.Something, new {data-animal = "pony"})%> x.某物,新的{data animal=“pony”})%> 在成员名称前面加一个@也不会起作用 更新:如果这是不可能的,有没有一个建议的方法来做我想要

可以在匿名类的成员名称中使用破折号(-)吗?我主要感兴趣的是使用asp.net mvc将自定义属性传递给html助手,因为我希望我的html通过html5验证,这从数据开始

不起作用的示例:

<%=Html.TextBoxFor(x => x.Something, new {data-animal = "pony"})%>
x.某物,新的{data animal=“pony”})%>
在成员名称前面加一个@也不会起作用

更新:如果这是不可能的,有没有一个建议的方法来做我想要的?我目前的临时解决方案是在整个过程中添加一个替换,如下所示:

<%=Html.TextBoxFor(x => x.Something, new {data___animal = "pony"}).Replace("___", "-")%>
x.某物,新的{data\uuuuuuu animal=“pony”})。替换(“\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu

但这很糟糕,因为它很难看,当
Model时会破裂。Buhu.

否,因为破折号是一个C#运算符(),而空格并不重要


现在,编译器认为您正在尝试从
数据中减去
动物
,除非为所讨论的类型指定了
-
运算符,否则该操作无效。

不可能将-,用作任何标识符的一部分。
不,不能使用连字符。您需要使用字母数字字符、下划线或描述的其他字符<代码>'-'
被视为减号<代码>数据动物
将被视为与
数据-动物
相同,因此,除非您分别定义了
数据
动物
(如果您定义了,它可能会出现微妙的错误!),否则它甚至不会编译

编辑:有了C#的能力,就可以使用Unicode转义序列生成标识符,您可以在标识符名称中获得破折号的效果。“&mdash”(较长的破折号字符)的转义序列为。因此,您可以将数据动物表示为
data\u2014animal
。但从编码风格的角度来看,我不确定为什么不选择更方便的命名约定


另外,“2.4.2标识符(C#)”中需要强调的另一点是:标识符中不能有两个这样的转义序列(例如
data\u2014\u2014animal
)。

在搜索同一问题时刚刚找到了这篇文章

我找到了这个链接:

它解决了这个问题。它提到以下几点:

[…]或者更好,只需使用ASP.NET MVC源代码:


收集Asp Mvc版本特定数据的方法-此处:

MVC 3+:使用下划线,它将自动被MVC替换

MVC 1?,2:见@Jean Francois answer,它指出

命名约定来自HTML5;Ps yeah,\u2014好像不是最优的。\u002d是连字符。当我看到问题中的“破折号”时,我首先想到了“&mdash”字符。@svinto:你说得对,\u2014不是最优的。我只是指出,如果你想要破折号字符,你实际上可以在标识符中使用它。这就是说,即使您确实有办法使这些\u*标识符更具可读性,它们看起来也会与标识符中不允许使用的字符('-'等)相同(除非语法突出显示不同,但必须承认,我对此不太精通)。不。。。新的{@data\u002drole=“collapsible”}未编译。从链接中可以看到:“幸运的是,ASP.NET MVC 3中添加了一个解决方案,因此您可以使用下划线,下划线将自动转换为连字符。”您不必像@joelsand所说的那样执行此操作。如果你想用下划线的话,这很糟糕。这个答案是正确的,但不完整。有一个解决办法。请看我对这个问题的回答。您的解决方案并不是在所有情况下都有效:Html.DroppableZone(Zones.Left).WrapIn(“div”,new{@data role=“collapsable”}).Render();不返回可以替换任何内容的字符串:-(
public static RouteValueDictionary AnonymousObjectToHtmlAttributes(object htmlAttributes)
{
    RouteValueDictionary result = new RouteValueDictionary();
    if (htmlAttributes != null)
    {
        foreach (System.ComponentModel.PropertyDescriptor property in System.ComponentModel.TypeDescriptor.GetProperties(htmlAttributes))
        {
            result.Add(property.Name.Replace('_', '-'), property.GetValue(htmlAttributes));
        }
    }
    return result;
}