[英]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 ...實例的Type
為Type
的解決方案。
您可以在靜態方法中使用System.Diagnostics.StackFrame
類,如下所示:
StackFrame currentStackFrame = new StackFrame();
Type type = currentStackFrame.GetMethod().DeclaringType;
如果屬性是static
,則不必擔心繼承; 它不能被覆蓋,因此無論如何它將始終在基類中聲明。 使用typeof
是typeof
的方法。
如果您不想使用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.