如何使用Reflection获取静态属性

时间:2009-01-16 18:26:57

标签: .net reflection static

所以这看起来非常基本,但我无法让它发挥作用。我有一个Object,我使用反射来获取它的公共属性。其中一个属性是静态的,我没有运气。

Public Function GetProp(ByRef obj As Object, ByVal propName as String) as PropertyInfo
    Return obj.GetType.GetProperty(propName)

End Function

上面的代码适用于公共实例属性,到目前为止我只需要它。据说我可以使用BindingFlags来请求其他类型的属性(私有,静态),但我似乎找不到合适的组合。

Public Function GetProp(ByRef obj As Object, ByVal propName as String) as PropertyInfo
    Return obj.GetType.GetProperty(propName, Reflection.BindingFlags.Static Or Reflection.BindingFlags.Instance Or Reflection.BindingFlags.Public)

End Function

但是,请求任何静态成员都不返回任何内容。 .NET反射器可以很好地看到静态属性,所以很明显我在这里遗漏了一些东西。

8 个答案:

答案 0 :(得分:115)

或者只看这个...

Type type = typeof(MyClass); // MyClass is static class with static properties
foreach (var p in type.GetProperties())
{
   var v = p.GetValue(null, null); // static classes cannot be instanced, so use null...
}

答案 1 :(得分:41)

这是C#,但应该给你一个想法:

public static void Main() {
    typeof(Program).GetProperty("GetMe", BindingFlags.NonPublic | BindingFlags.Static);
}

private static int GetMe {
    get { return 0; }
}

(您只需要OR NonPublic和Static)

答案 2 :(得分:33)

有点清晰......

// Get a PropertyInfo of specific property type(T).GetProperty(....)
PropertyInfo propertyInfo;
propertyInfo = typeof(TypeWithTheStaticProperty)
    .GetProperty("NameOfStaticProperty", BindingFlags.Public | BindingFlags.Static); 

// Use the PropertyInfo to retrieve the value from the type by not passing in an instance
object value = propertyInfo.GetValue(null, null);

// Cast the value to the desired type
ExpectedType typedValue = (ExpectedType) value;

答案 3 :(得分:27)

好的,所以我的关键是使用.FlattenHierarchy BindingFlag。我真的不知道为什么我只是在预感中添加它并开始工作。因此,允许我获取公共实例或静态属性的最终解决方案是:

obj.GetType.GetProperty(propName, Reflection.BindingFlags.Public _
  Or Reflection.BindingFlags.Static Or Reflection.BindingFlags.Instance Or _
  Reflection.BindingFlags.FlattenHierarchy)

答案 4 :(得分:6)

myType.GetProperties(BindingFlags.Public | BindingFlags.Static |  BindingFlags.FlattenHierarchy);

这将返回静态基类或特定类型中的所有静态属性,也可能返回子项。

答案 5 :(得分:2)

我想在使用基于TypeInfo的新反射API的同时为自己澄清这一点 - 其中BindingFlags无法可靠地使用(取决于目标框架)。

在新的'反射,要获取类型的静态属性(不包括基类),您必须执行以下操作:

IEnumerable<PropertyInfo> props = 
  type.GetTypeInfo().DeclaredProperties.Where(p => 
    (p.GetMethod != null && p.GetMethod.IsStatic) ||
    (p.SetMethod != null && p.SetMethod.IsStatic));

适用于只读或只写属性(尽管只写是一个糟糕的主意)。

DeclaredProperties成员也没有区分具有公共/私有访问者的属性 - 因此要过滤可见性,您需要根据需要使用的访问者来执行此操作。例如 - 假设上述呼叫已经返回,您可以执行以下操作:

var publicStaticReadable = props.Where(p => p.GetMethod != null && p.GetMethod.IsPublic);

有一些快捷方法可用 - 但最终我们将来会围绕TypeInfo查询方法/属性编写更多扩展方法。此外,新的API迫使我们考虑我们认为的私人&#39;或者&#39; public&#39;从现在开始的财产 - 因为我们必须根据个人访问者过滤自己。

答案 6 :(得分:1)

以下似乎对我有用。

using System;
using System.Reflection;

public class ReflectStatic
{
    private static int SomeNumber {get; set;}
    public static object SomeReference {get; set;}
    static ReflectStatic()
    {
        SomeReference = new object();
        Console.WriteLine(SomeReference.GetHashCode());
    }
}

public class Program
{
    public static void Main()
    {
        var rs = new ReflectStatic();
        var pi = rs.GetType().GetProperty("SomeReference",  BindingFlags.Static | BindingFlags.Public);
        if(pi == null) { Console.WriteLine("Null!"); Environment.Exit(0);}
        Console.WriteLine(pi.GetValue(rs, null).GetHashCode());


    }
}

答案 7 :(得分:-2)

试试这个C# Reflection链接。

注意我认为BindingFlags.Instance and BindingFlags.Static是独占的。