C# 在基静态方法中获取派生类属性-RIDDLE:)

C# 在基静态方法中获取派生类属性-RIDDLE:),c#,reflection,static,properties,derived-class,C#,Reflection,Static,Properties,Derived Class,我想详细说明一下我目前正在进行的项目,但那会有点长。相反,我将发布一个编程谜语,它基本上解释了我试图实现的目标。:) 抽象类A { //key=派生类名称,value=派生类公开的属性列表。 私有静态字典_-DerivedPropertyNames; 静态A() { 初始化驱动属性名称(); } 私有静态void InitializeDrivePropertyNames() { //...???... } } 谜团是如何创建一个抽象基类,它将保存其所有派生类属性的静态缓存 请注意,这样做的目的

我想详细说明一下我目前正在进行的项目,但那会有点长。相反,我将发布一个编程谜语,它基本上解释了我试图实现的目标。:)

抽象类A
{
//key=派生类名称,value=派生类公开的属性列表。
私有静态字典_-DerivedPropertyNames;
静态A()
{
初始化驱动属性名称();
}
私有静态void InitializeDrivePropertyNames()
{
//...???...
}
}
谜团是如何创建一个抽象基类,它将保存其所有派生类属性的静态缓存

请注意,这样做的目的是避免按名称加载程序集。

在基类中没有简单(有效)的方法来实现这一点。
只需在每个派生类中实现一个静态构造函数,并使用它注册属性


还可以查看WPFx中的依赖项属性,以进行比较

如果您可以等待子类型的实例被实例化,那么您可以使用A的常规构造函数来注册实现类:

public A()
{
    Type childType = GetType();
    string className = childType.Name;
    if (!_DerivedPropertyNames.ContainsKey(className)) {
         // add properties for this class
    }
}

在任何实例化之前,如果不在子类中添加逻辑(我想您不希望这样),您将很难在静态构造函数中完成任务。原因是当调用A的静态构造函数时,您将无法强制执行包含实现A的类型的所有程序集。

是否只枚举当前执行的程序集中存在的派生类?嗯,这是一个好问题……因为在我们的项目中,这是框架代码,所以我假设答案是否定的。>抽象基类将保存其所有派生类属性的静态缓存。你能解释一下原因吗?这看起来不像是实际可用的东西。如果
A
是公共的,而不是内部的(即在它自己的程序集之外可见),那么您想要实现的目标似乎是行不通的。例如,我可以从我自己的程序集中的
a
派生一个类,而
a
中的代码即使在程序集中存在的情况下也不会出现。当然,即使它知道,它仍然必须加载它才能访问它的类型。这背后的想法是让基类保存派生类放在其属性上的属性值
public A()
{
    Type childType = GetType();
    string className = childType.Name;
    if (!_DerivedPropertyNames.ContainsKey(className)) {
         // add properties for this class
    }
}