簡體   English   中英

如何在靜態成員中獲取類類型的System.Type實例?

[英]How to get System.Type instance of a class-type in Static Member?

我在一個類中有一個公共靜態屬性。 該類具有一些自定義屬性。 我想在靜態屬性中訪問屬性。

在非靜態成員中,我可以使用this.GetType()獲得當前類的類型,但是如何在類的靜態成員中實現呢?

請注意..

  • 由於繼承問題,我不想使用typeof(typename) [我將將此屬性繼承到派生類。]

  • 我也不想使用泛型

編輯

這是我的目標。

我有一個稱為EntityBase的抽象基類。 我所有的實體都來自此類。 每個實體還帶有一個名為TableMappingAttribute的自定義屬性,該屬性使我知道在運行時它引用/映射的表。 我已經在EntityBase中擁有一個屬性,該屬性可向我返回該實體的映射TableName。

我將始終需要一個實體實例來訪問TableName屬性。 我希望某個時候可以靜態訪問此屬性,例如MyEntity.TableName。 我的項目中有大量實體。 我希望將此靜態屬性添加到EntityBase類本身中。 因此,我必須在運行時發現類型。 我如何在EntityBase類本身中執行此操作?

Thnaks。

基本上你不能。 typeof(...) 您需要使用的。

請記住,如果您嘗試使用:

Type type = MyDerivedType.SomeStaticProperty;

MyBaseType 聲明的,實際上最終將被編譯為

Type type = MyBaseType.SomeStaticProperty;

無論如何。 靜態成員基本上不是多態的。 如果嘗試多態使用它們,則會遇到類似這樣的問題。

編輯:因此,從您的編輯看來,您似乎正試圖做上述類型的事情,

MyEntity.TableName

代替

EntityBase.TableName

只是行不通。 編譯器將發出代碼以獲取EntityBase.TableName。 運行時沒有“當前類”的概念。 這里沒有上下文。

基本上,您需要更改設計。 如果要使用繼承,則可能需要有一個並行的層次結構-一個用於元數據(表名稱之類的東西),另一個用於實際對象。 所以你會有類似的東西:

public class MyEntity : EntityBase<MyEntityType>

其中MyEntityType從並行層次結構中的EntityType派生。 然后,您可以在元數據層次結構中使用繼承。

另外,只要使EntityBase通用,就可以讓您了解正在談論的實體的類型:

public class MyEntity : EntityBase<MyEntity>

我知道您說過您不想使用泛型,但是由於您想做的事情行不通,因此至少應該考慮一下……

由於繼承問題,我不想使用typeof(typename)。

靜態屬性不是正常意義上的繼承 當然,它們在范圍內,但事實並非如此。 獲得所需內容的唯一方法是查看堆棧框架,但這是丑陋且棘手的(如果啟用了優化,則存在風險)。

我將重構一個使用instace ...實例的TypeType的解決方案。

您可以在靜態方法中使用System.Diagnostics.StackFrame類,如下所示:

StackFrame currentStackFrame = new StackFrame();
Type type = currentStackFrame.GetMethod().DeclaringType;

如果屬性是static ,則不必擔心繼承; 它不能被覆蓋,因此無論如何它將始終在基類中聲明。 使用typeoftypeof的方法。

如果您不想使用typeof(),那么您就不走運了,因為這是獲取靜態類的Type對象的唯一方法(除非您想通過調用Type.GetType()和按名稱查找)

我看不到繼承的問題。

Type type = typeof(YourStaticClass);

Attribute[] attributes = type.GetCustomAttributes(...);

父母不知道有幾個孩子。 但是孩子知道父母。 父母對孩子的唯一了解是通過多態性,這不是靜態成員的屬性。

您想要做的是在父級的公共靜態屬性中了解子級。 為什么不考慮在基類的靜態方法中將子類引用作為參數發送,然后在基類中通過調用其子類的GetType方法來獲得子類的引用...

public static string GetTableName(BaseClass childsObjectWrappedInBaseReference) {
   Type type = childsObjectWrappedInBaseReference.GetType();
   ....
   ....
}

暫無
暫無

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

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