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

gg0vcinb  于 2022-11-19  发布在  .NET
关注(0)|答案(3)|浏览(338)

我在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月

当我再次查找文档时,他们删除了上述语句,并将其替换为。
如前面的范例所示,在型别和命名空间的情况下,产生的名称通常不是完整的。

yeotifhr

yeotifhr1#

经过一点挖掘,我发现这个问题已经讨论了开发这个功能在这里https://roslyn.codeplex.com/discussions/552376,特别是在这里https://roslyn.codeplex.com/discussions/552377的意见,由MgSam
正如它所建议的那样,我可以想象这样的事情会发生,以获得一个完全限定的名称:绑定到完全限定的名称((Microsoft)的名称+“.”+(Microsoft.数据)的名称+“.”+(Microsoft.数据.实体)的名称+“.”+(Microsoft.数据.实体.实体对象)的名称);
答案是
我认为typeof(EntityObject).FullName在您的情况下是完全足够的。
会议结束了讨论,没有对另一种方法作进一步的评论。
不幸的是,这意味着没有办法直接使用nameof并获得完全限定的名称,以便在Attributes中使用。
可能这就是它的结束,我想微软应该改变他们的文档,使它更清晰和准确。

h79rfbju

h79rfbju2#

如果您不想指定“reference”型别(不是C#意义上的“reference type”)来取得目的命名空间(为什么要指定?),而且保存以.分隔的nameof运算子字串,则您可以取得组件名称来包含“base”命名空间(如果它遵循预设惯例,而且与您的预设命名空间命名相同),如下所示:

$"{Assembly.GetExecutingAssembly().GetName().Name}.{nameof(Level1Namespace)}.{nameof(Level2Namespace)}"

这至少可以为您节省一些代码,并防止您在重构过程中更改程序集名称,甚至将整个类层次结构移动到另一个程序集,但它当然不会防止名称空间层次结构本身的更改。那么我想你确实需要一个“参考”类型,例如可能是所需命名空间中所有其他类继承的抽象类或接口,然后对其应用accepted answer解决方案。

wko9yo5t

wko9yo5t3#

因此,我遇到了一个类似的问题,并找到了两个可行的解决方案:如果您也想拥有命名空间,只需将它们包含在发送给任一全名实现的表达式中即可
第一:

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;
}

第二:

public static class FullName
{
    public static string Of<T>( T _, [CallerArgumentExpression( "_" )] string fullName = "" )
     => fullName; 
}

用法如下所示:

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 )}" );

输出为:
名称:此处
fullnameof:这是一个非常嵌套的属性
功能全名:This.Is.A.Very.Nested.Property.Here
另一个选项是将其转换为如下静态函数:

相关问题