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

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

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

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

因此,我想做的是找出定义 NameProperty 的类型并存储该类型和名称。我怎样才能做到这一点?

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

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

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

有人知道吗?

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

有帮助吗?

解决方案

这是 几乎 的副本 这个问题, , 但不是 相当. 。不过看看那个人的答案。

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

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top