我正在尝试获取以下课程中的人员姓名。我可以很好地获得PropertyInfo列表,表明People有Bob和Sally,但我无法获得对Bob和Sally的引用。我该怎么做?
public static class People
{
public static Person Bob { get; }
public static Person Sally { get; }
}
PropertyInfo[] properties = typeof(People).GetProperties();
foreach (PropertyInfo info in properties)
{
if (info.PropertyType == typeof(Person))
{
// how do I get a reference to the person here?
Person c = info.GetValue(?????, ?????) as Person;
if (null != c)
{
Console.WriteLine(c.Name);
}
}
}
编辑将null == c更改为null!= c以使console.writeline执行
答案 0 :(得分:1)
使用:
Person c = (Person) info.GetValue(null, null);
if (c != null)
{
Console.WriteLine(c.Name);
}
第一个null是属性的目标 - 它是null,因为它是一个静态属性。第二个空是说没有任何索引器参数,因为这只是一个属性,而不是索引器。 (他们是CLR的同一成员。)
我已将结果的使用从as
更改为演员,因为您期望结果为Person
,因为您是已检查过属性类型。
然后我改变了与null进行比较的操作数的顺序,以及颠倒了感觉 - 如果你知道c.Name
,你不想尝试打印c
一片空白!在C#中,if (2 == x)
的旧C ++习语以避免意外分配几乎总是毫无意义,因为if
条件无论如何都必须是bool
表达式。根据我的经验,大多数人发现代码更易读,首先是变量,第二是常量。
答案 1 :(得分:0)
这是我使用的方法,我将其投入到自己的方法中。这将返回一个对象数组,这些对象是您传入的类型中静态可用的所有实例。原始类型是否为静态无关紧要。
using System;
using System.Linq;
using System.Reflection;
public static object[] RetrieveInstancesOfPublicStaticPropertysOfTypeOnType(Type typeToUse) {
var instances = new List<object>();
var propsOfSameReturnTypeAs = from prop in typeToUse.GetProperties(BindingFlags.Public | BindingFlags.Static)
where prop.PropertyType == typeToUse
select prop;
foreach (PropertyInfo props in propsOfSameReturnTypeAs) {
object invokeResult = typeToUse.InvokeMember(
props.Name,
BindingFlags.GetProperty,
null,
typeToUse,
new object[] { }
);
if (invokeResult != null) {
instances.Add(invokeResult);
}
}
return instances.ToArray();
}