2

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

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

请注意..

  • 由于继承问题,我不想使用typeof(typename) 。[我将把这个属性继承到派生类。]。

  • 我也不想使用泛型

编辑

这是我的目标。

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

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

谢谢。

4

6 回答 6

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>

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

于 2009-07-14T08:26:15.593 回答
2

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

静态属性不是通常意义上的继承。当然,它们在范围内,但不一样。获得您想要的东西的唯一方法是查看堆栈帧,但这是丑陋和骇人的(如果启用了优化,还有风险)。

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

于 2009-07-14T08:27:17.633 回答
0

您可以System.Diagnostics.StackFrame像这样在静态方法中使用该类:

StackFrame currentStackFrame = new StackFrame();
Type type = currentStackFrame.GetMethod().DeclaringType;
于 2009-07-14T08:26:30.460 回答
0

static如果属性是;你不需要担心继承。它不能被覆盖,所以无论如何它总是在基类中声明。使用typeof是要走的路。

于 2009-07-14T08:28:11.937 回答
0

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

我没有看到继承的问题。

Type type = typeof(YourStaticClass);

Attribute[] attributes = type.GetCustomAttributes(...);
于 2009-07-14T08:28:38.020 回答
0

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

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

public static string GetTableName(BaseClass childsObjectWrappedInBaseReference) {
   Type type = childsObjectWrappedInBaseReference.GetType();
   ....
   ....
}
于 2009-07-14T08:32:46.983 回答