簡體   English   中英

如何使用 nameof 獲取 C# 屬性中類中屬性的完全限定名稱?

[英]How to use nameof to get the fully qualified name of a property in a class in C# Attributes?

我在 ASP.Net MVC 項目中使用 Foolproof 庫,在某些情況下,我需要使用 attribues 檢查模型成員類中的屬性。

例如,我有一個用戶類,它有一個地址類型的屬性,我需要檢查地址中的城市。

對於我的示例,屬性需要在點符號中具有屬性名稱,您可以說“Address.City”。

當然,如果我稍后需要更改名稱(地址或城市),這會遇到重構問題

我需要為此使用 nameof ,當然,如果我像這樣使用它:

nameof(Address.City) 

它將產生 City Only。

我需要 nameof 因為它產生屬性中允許的常量值。

我發現參考文獻告訴這是可能的,但不是如何。 https://msdn.microsoft.com/en-us/library/dn986596.aspx在備注部分說:

如果需要獲得完全限定的名稱,可以將 typeof 表達式與 nameof 一起使用。

但我找不到任何地方告訴我如何做到這一點。

請問有人可以幫忙嗎? 預先感謝您的時間和努力。

更新: 2019 年 10 月

當我再次查找文檔時,他們刪除了上述語句並將其替換為。

如前面的示例所示,在類型和命名空間的情況下,生成的名稱通常不是完全限定的。

經過一番挖掘,我發現在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 在你的情況下是完全足夠的。

這結束了討論,沒有對另一種方法做進一步的評論。

不幸的是,這意味着無法直接使用 user nameof 並獲取完全限定名稱以在 Attributes 中使用。

可能這就是它的結束,我認為微軟應該更改他們的文檔以使其更加清晰和准確。

如果你不希望指定一個“參考”類型(在C#感不是“引用類型”),讓你的目標命名空間(為什么要你嗎?),並節省投入的字符串nameof運營商相隔. ,那么您可以通過獲取程序集名稱來包含“基本”名稱空間,如果它遵循默認約定並且與您的默認名稱空間命名相同,如下所示:

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

這至少會為您節省一些代碼,並保護您免受更改程序集名稱甚至將整個類層次結構移動到另一個程序集的重構,但它當然不會防止名稱空間層次結構本身內的更改。 為了防止這種情況發生,我認為您確實需要一個“引用”類型,例如可能是所需命名空間中的所有其他類繼承的抽象類或接口,然后對其應用公認的答案解決方案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM