如何使用nameof获取C#属性中的类中的属性的完全限定名称?

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


Ahm*_*hwa 5

经过一番挖掘,我发现在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中使用。

可能到此为止了,我想微软应该更改他们的文档以使其更加清晰和准确。