[英]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.