繁体   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