【问题标题】:How can I use Reflection to get the value of a Static Property of a Type without a concrete instance如何在没有具体实例的情况下使用反射来获取类型的静态属性的值
【发布时间】:2012-06-22 14:06:35
【问题描述】:

考虑以下类:

public class AClass : ISomeInterface
{
    public static int AProperty
    {
   get { return 100; } 
    }
}

然后我有另一个类如下:

public class AnotherClass<T>
   where T : ISomeInterface
{

}

我通过以下方式实例化:

AnotherClass<AClass> genericClass = new  AnotherClass<AClass>();

如何在没有 AClass 的具体实例的情况下从我的 genericClass 中获取 AClass.AProperty 的静态值?

【问题讨论】:

    标签: c# asp.net generics reflection


    【解决方案1】:

    类似

    typeof(AClass).GetProperty("AProperty").GetValue(null, null)
    

    会的。别忘了投到int

    文档链接:http://msdn.microsoft.com/en-us/library/b05d59ty.aspx(他们也有静态属性的示例。)但如果您确切知道AClass,则可以只使用AClass.AProperty

    如果您在AnotherClass&lt;T&gt; 内部为T = AClass,则可以将其称为T

    typeof(T).GetProperty("AProperty").GetValue(null, null)
    

    如果您确定您的T 具有静态属性AProperty,这将起作用。如果无法保证在任何T 上存在此类属性,则需要在途中检查返回值/异常。

    如果您只对AClass 感兴趣,您可以使用类似

    if (typeof(T) == typeof(AClass))
        n = AClass.AProperty;
    else
        ???
    

    【讨论】:

    • 太棒了。我现在发现的唯一问题是我无法在接口中定义静态属性,这是它需要做的。我想我可以添加一个非静态属性和一个返回相同值的静态属性,一个用于实例使用,一个用于在类型上引用?还是有别的办法?
    • 或者我可以使用 new T().AProperty 获得非静态属性,但这似乎是不好的做法。你怎么看?
    • @Stewart:嗯,构建一个新的T 可能会很昂贵。很遗憾,接口确实不能包含静态的东西。
    • @Stewart:也许(如果您的设计允许)您可以将AClass 拆分为静态和非静态部分,并将静态部分制作成具有实例方法/属性的单独类?以前的非静态 AClass 的实例将具有对新类的单个实例的静态引用。
    【解决方案2】:

    首先获取AnotherClass 实例的泛型类型。

    然后获取静态属性。

    然后获取属性的静态值。

    // I made this sealed to ensure that `this.GetType()` will always be a generic
    // type of `AnotherClass<>`.
    public sealed class AnotherClass<T>
    {
        public AnotherClass(){
            var aPropertyValue = ((PropertyInfo)
                    this.GetType()
                        .GetGenericArguments()[0]
                        .GetMember("AProperty")[0])
                .GetValue(null, null);
        }
    }
    

    当然,认识到不可能确保“AProperty”存在,因为接口不适用于静态签名,我删除了ISomeInterface,因为它与解决方案无关。

    【讨论】:

      【解决方案3】:

      【讨论】:

        猜你喜欢
        • 2020-10-14
        • 1970-01-01
        • 2022-12-03
        • 2023-03-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-07-19
        • 2013-09-20
        相关资源
        最近更新 更多