【问题标题】:.NET Reflection - Finding the type that defines a static member.NET 反射 - 查找定义静态成员的类型
【发布时间】:2008-12-27 19:20:25
【问题描述】:

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

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

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

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

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

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

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

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

有人知道吗?

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

【问题讨论】:

    标签: .net reflection system.reflection


    【解决方案1】:

    几乎this question的复制品,但不是完全。不过看看那个人的答案。

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

    [PropertyName("Name")]
    private static readonly IPageProperty NameProperty = null;
    
    static
    {
        PropertyRepository.RegisterProperties(typeof(SimpleTemplate));
    }
    

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

    【讨论】:

    • 是的,您指向的链接显然有帮助。你的评论让我意识到有一种更简单的方法可以做到这一点,即使它不会完全符合你的建议。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-17
    • 1970-01-01
    • 2013-02-02
    • 1970-01-01
    • 2021-09-11
    • 2017-10-20
    • 1970-01-01
    相关资源
    最近更新 更多