所以这看起来非常基本,但我无法让它发挥作用。我有一个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反射器可以很好地看到静态属性,所以很明显我在这里遗漏了一些东西。
答案 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链接。