.NET Reflection - 查找定义静态成员的类型

时间:2008-12-27 19:20:26

标签: .net reflection system.reflection

我有反思问题。我需要找到实例化静态成员的类型。我的代码如下所示:

    private class SimpleTemplate : PageTemplate
    {
        internal static readonly IPageProperty NameProperty =
            PropertyRepository.Register("Name");
    }

PropertyRepository是一个属性的存储库(显然)。它使用我正在构建的类型系统跟踪已注册的所有属性。

为了成功地做到这一点,我需要跟踪所有属性以及它们的定义类型。否则,如果定义了两个具有相同名称的属性,则属性存储库将无法区分它们。

所以,我想要做的是找出定义NameProperty的类型并存储类型和名称。我怎么能这样做?

我想使用强类型,即我不想将类型作为参数发送到PropertyRepository.Register。这很容易出错,因为我无法验证类型参数是否正确。

我想,解决方案将涉及反思。有没有办法使用反射来确定哪种类型调用静态方法?使用静态构造函数(编译器生成)隐式实例化静态属性。有没有办法让我获得该构造函数的句柄?这似乎是可行的,我只是无法弄清楚如何做到这一点。

换句话说:如果方法A调用方法B,B有什么方法可以告诉它是使用反射从A调用的?我想有,但我不知道如何。

有人知道吗?

编辑:我看过StackFrame类,虽然它似乎做了我想要的,但它在生产代码中可能不可靠(我需要它)。

1 个答案:

答案 0 :(得分:2)

几乎this question的副本,但不是相当。看看那个人的答案。

我个人认为我会传递这种类型。另一种方法是使用属性,例如

[PropertyName("Name")]
private static readonly IPageProperty NameProperty = null;

static
{
    PropertyRepository.RegisterProperties(typeof(SimpleTemplate));
}

PropertyRepostiory.RegisterProperties然后可以使用反射设置readonly字段的值(如果这有效 - 我没有尝试过;可能会强制执行readonly-ness)。虽然它有点icky ......或者,您可以在需要时从存储库中获取属性。