代码之家  ›  专栏  ›  技术社区  ›  Karl

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

  •  0
  • Karl  · 技术社区  · 16 年前

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

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

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

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

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

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

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

    换言之:如果方法A调用方法B,有没有任何方法B可以分辨它是从使用反射调用的?我想是的,但我不知道怎么回事。

    有人知道吗?

    编辑: 我已经研究过stackframe类,虽然它似乎可以满足我的需要,但它在生产代码中可能不可靠(我需要这样做)。

    1 回复  |  直到 16 年前
        1
  •  2
  •   Community CDub    8 年前

    这是 几乎 复制品 this question ,但不是 相当地 . 看看那个答案。

    我个人认为我会通过这类考试。另一种选择是使用属性,例如

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

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