我在ASP.NetMVC项目中使用Foolproof库,在某些情况下,我需要使用属性检查我的模型的成员类中的属性。
例如,我有一个用户类,它有一个Address类型的属性,我需要检查Address中的City。
属性的名称需要用点表示法来表示,对于我的例子,你可以说“Address.City”。
当然,如果我以后需要更改其中一个名称(地址或城市),这会遇到重构问题。
我需要使用nameof来实现这个目的,当然,如果我这样使用它:
nameof(Address.City)
它将生成“仅城市”。
我需要nameof,因为它会产生属性中允许的常量值。
我发现参考资料告诉我们这是可能的,但没有告诉我们如何做到。https://msdn.microsoft.com/en-us/library/dn986596.aspx在备注部分说:
如果需要获得完全限定的名称,可以将typeof表达式与nameof沿着使用。
但我找不到任何地方告诉你怎么做。
有谁能帮忙吗?提前感谢您的时间和努力。
**更新日期:**2019年10月
当我再次查找文档时,他们删除了上述语句,并将其替换为。
如前面的范例所示,在型别和命名空间的情况下,产生的名称通常不是完整的。
3条答案
按热度按时间yeotifhr1#
经过一点挖掘,我发现这个问题已经讨论了开发这个功能在这里https://roslyn.codeplex.com/discussions/552376,特别是在这里https://roslyn.codeplex.com/discussions/552377的意见,由MgSam
正如它所建议的那样,我可以想象这样的事情会发生,以获得一个完全限定的名称:绑定到完全限定的名称((Microsoft)的名称+“.”+(Microsoft.数据)的名称+“.”+(Microsoft.数据.实体)的名称+“.”+(Microsoft.数据.实体.实体对象)的名称);
答案是
我认为typeof(EntityObject).FullName在您的情况下是完全足够的。
会议结束了讨论,没有对另一种方法作进一步的评论。
不幸的是,这意味着没有办法直接使用nameof并获得完全限定的名称,以便在Attributes中使用。
可能这就是它的结束,我想微软应该改变他们的文档,使它更清晰和准确。
h79rfbju2#
如果您不想指定“reference”型别(不是C#意义上的“reference type”)来取得目的命名空间(为什么要指定?),而且保存以
.
分隔的nameof
运算子字串,则您可以取得组件名称来包含“base”命名空间(如果它遵循预设惯例,而且与您的预设命名空间命名相同),如下所示:这至少可以为您节省一些代码,并防止您在重构过程中更改程序集名称,甚至将整个类层次结构移动到另一个程序集,但它当然不会防止名称空间层次结构本身的更改。那么我想你确实需要一个“参考”类型,例如可能是所需命名空间中所有其他类继承的抽象类或接口,然后对其应用accepted answer解决方案。
wko9yo5t3#
因此,我遇到了一个类似的问题,并找到了两个可行的解决方案:如果您也想拥有命名空间,只需将它们包含在发送给任一全名实现的表达式中即可
第一:
第二:
用法如下所示:
输出为:
名称:此处
fullnameof:这是一个非常嵌套的属性
功能全名:This.Is.A.Very.Nested.Property.Here
另一个选项是将其转换为如下静态函数: