Ahm*_*hwa 4 c# asp.net asp.net-mvc attributes
我在ASP.Net MVC项目中使用Foolproof库,在某些情况下,我需要使用属性检查模型成员类中的属性。
例如,我有一个用户类,其属性类型为Address,我需要检查Address中的City。
在我的示例中,属性需要以点符号表示属性名称,您可以说“ Address.City”。
当然,如果以后我需要更改任何一个名称(地址或城市),这将遇到重构问题
我需要为此使用nameof,当然,如果我这样使用它,则当然要使用它:
nameof(Address.City)
Run Code Online (Sandbox Code Playgroud)
它只会产生City。
我需要nameof,因为它会产生属性中允许的常量值。
我发现参考资料告诉我们有可能,但没有。 https://msdn.microsoft.com/zh-cn/library/dn986596.aspx 在备注部分中说:
如果需要获取全限定名称,则可以将typeof表达式与nameof一起使用。
但是我找不到任何地方可以告诉你如何做。
有人可以帮忙吗?在此先感谢您的时间和精力。
更新:十月-2019
当我再次查阅文档时,他们删除了上面的声明,并将其替换为。
如前面的示例所示,在类型和名称空间的情况下,产生的名称通常不完全合格。
小智 7
因此,我遇到了类似的问题,并找到了两个可行的解决方案:如果您也想拥有命名空间,只需将它们包含在发送到全名实现的表达式中
第一的:
public ref struct FullNameOf<T>
{
string _fullName;
public FullNameOf(T _, [CallerArgumentExpression("_")] string fullName = "" )
{
_fullName = fullName;
}
public static implicit operator string(FullNameOf<T> obj)
=> obj._fullName;
}
Run Code Online (Sandbox Code Playgroud)
第二:
public static class FullName
{
public static string Of<T>( T _, [CallerArgumentExpression( "_" )] string fullName = "" )
=> fullName;
}
Run Code Online (Sandbox Code Playgroud)
用法看起来像这样:
public class This
{
public class Is
{
public class A
{
public class Very
{
public class Nested
{
public class Property
{
public static string Here = string.Empty;
}
}
}
}
}
}
Console.WriteLine( $"nameof: {nameof(This.Is.A.Very.Nested.Property.Here) }" );
Console.WriteLine( $"fullnameof: { new FullNameOf<string>(This.Is.A.Very.Nested.Property.Here) }" );
Console.WriteLine( $"fullnameof func: {FullName.Of( This.Is.A.Very.Nested.Property.Here )}" );
Run Code Online (Sandbox Code Playgroud)
输出是:
nameof:这里
fullnameof:This.Is.A.Very.Nested.Property.Here
fullnameof func:This.Is.A.Very.Nested.Property.Here
经过一番挖掘,我发现在https://roslyn.codeplex.com/discussions/552376 (特别是在此处 https://roslyn.codeplex.com/discussions/552377)开发此功能时已经讨论了此问题 对于MgSam的评论
按照建议的方式,我可以想象发生这样的事情来获得完全限定的名称:BindToFullyQualifiedName(nameof(Microsoft)+“。” + nameof(Microsoft.Data)+“。” + nameof(Microsoft.Data.Entities)+ “。” + nameof(Microsoft.Data.Entities.EntityObject));
答案是
我认为typeof(EntityObject).FullName在您的情况下就足够了。
从而结束了讨论,而没有其他评论这样做的方式。
不幸的是,这意味着无法使用用户nameof来直接获取全限定名称以在Attributes中使用。
可能到此为止了,我想微软应该更改他们的文档以使其更加清晰和准确。
| 归档时间: |
|
| 查看次数: |
2897 次 |
| 最近记录: |