如何在静态成员中获取类类型的System.Type实例?

时间:2009-07-14 08:14:51

标签: c# reflection static-members

我在类中有一个公共静态属性。该类具有一些应用于它的自定义属性。我想在静态属性中访问属性。

在非静态成员中,我可以使用this.GetType()获取当前类的类型,但是如何在类的静态成员中执行此操作?

请注意..

  • 我不想使用 typeof(typename)到期 继承问题。 [我会有 此属性继承到派生 班]。

  • 我也不想使用 Generics 好。

修改

这是我的目标。

我有一个名为EntityBase的抽象基类。我的所有实体都来自这个类。每个实体还带有一个名为TableMappingAttribute的自定义属性,它让我知道它在运行时引用/映射到的表。我已经在EntityBase中有一个属性,它返回实体的映射TableName。

我总是需要一个实体实例来访问TableName属性。我希望有时会静态访问此属性,例如MyEntity.TableName。我的项目中有大量实体。我希望在EntityBase类本身中添加此静态属性。所以我必须在运行时发现类型。我如何在EntityBase类本身中执行此操作?

Thnaks。

6 个答案:

答案 0 :(得分:4)

基本上,你不能。 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>

我知道你说过你不想使用泛型,但是你想要做的事情是行不通的,你至少应该考虑一下......

答案 1 :(得分:2)

  

由于继承问题,我不想使用typeof(typename)。

在正常意义上,

静态属性不是继承的。当然,它们是范围内的,但这是不一样的。获得你想要的东西的唯一方法是查看堆栈框架,但这是丑陋和hacky(如果启用了优化,则风险很大)。

我会重构一个使用instace的解决方案......实例有一个Type

答案 2 :(得分:0)

您可以在静态方法中使用System.Diagnostics.StackFrame类,如下所示:

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

答案 3 :(得分:0)

如果属性为static,则无需担心继承;它不能被覆盖,所以无论如何它总是在基类中声明。使用typeof是可行的方法。

答案 4 :(得分:0)

如果您不想使用typeof(),那么您运气不好,因为这是获取静态类的Type对象的唯一方法(除非您想通过调用Type.GetType来查找类型) ()并按名称查找)

我没有看到继承的问题。

Type type = typeof(YourStaticClass);

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

答案 5 :(得分:0)

父母不知道它有多少孩子。但是孩子知道它的父母。父母应该了解孩子的唯一方法是通过多态,这不是静态成员的属性。

您要做的是了解父级的公共静态属性中的子类。为什么不考虑将子类引用作为参数发送到基类的静态方法中,然后在基类中通过调用其GetType方法获得子类的引用...

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