我在类中有一个公共静态属性。该类具有一些应用于它的自定义属性。我想在静态属性中访问属性。
在非静态成员中,我可以使用this.GetType()获取当前类的类型,但是如何在类的静态成员中执行此操作?
请注意..
我不想使用 typeof(typename)到期 继承问题。 [我会有 此属性继承到派生 班]。
我也不想使用 Generics 好。
这是我的目标。
我有一个名为EntityBase的抽象基类。我的所有实体都来自这个类。每个实体还带有一个名为TableMappingAttribute的自定义属性,它让我知道它在运行时引用/映射到的表。我已经在EntityBase中有一个属性,它返回实体的映射TableName。
我总是需要一个实体实例来访问TableName属性。我希望有时会静态访问此属性,例如MyEntity.TableName。我的项目中有大量实体。我希望在EntityBase类本身中添加此静态属性。所以我必须在运行时发现类型。我如何在EntityBase类本身中执行此操作?
Thnaks。
答案 0 :(得分:4)
请记住,如果您尝试使用:
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();
....
....
}