2011-12-02 67 views
2

这里是我的代码:GetFields和GetProperties类型的循环?

var fields = type.GetFields(BindingFlags.Public | BindingFlags.Instance); 
foreach (FieldInfo field in fields) 
{ 
    //some code 
} 

var props = type.GetProperties(); 
foreach (PropertyInfo prop in props) 
{ 
    //exact same code 
} 

我知道我可以创建一个我可以叫两次,但想什么,我做的(如果可能的话)是单foreach的功能。像这样的事情(是的,代码不能正常工作。如果它的工作,我不会问这个问题。!):

var fields = type.GetFields(BindingFlags.Public | BindingFlags.Instance); 
var props = type.GetProperties(); 

foreach (PropertyInfo prop in fields && PropertyInfo prop in props) 
{ 
    //some code 
} 

我真的觉得有一种方法,即使我知道我的解决办法远远不是编译:(
感谢您的帮助!

回答

3

如果你通过的MemberInfo类公开的属性确定(这是两个字段信息和的PropertyInfo基地),那么你可以做到以下几点:

var fields = type.GetFields(BindingFlags.Public | BindingFlags.Instance).Cast<MemberInfo>(); 
var props = type.GetProperties().Cast<MemberInfo>(); 
var fieldsAndProperties = fields.Union(props); 

foreach (MemberInfo mi in fieldsAndProperties) 
{ 
... 
} 
1

如果MemberInfo展示的功能足以满足你的循环,那么你可以连接在同一个阵列或者其他枚举两个字段和属性并重复一次

这是可能的,因为FieldInfoPropertyInfo继承自MemberInfo类。

示例代码:

var fields = typeof(DateTime).GetFields(
    BindingFlags.Public | BindingFlags.Instance); 

var properties = typeof(DateTime).GetProperties(
    BindingFlags.Public | BindingFlags.Instance); 

var all = fields.Cast<MemberInfo>().Concat(properties.Cast<MemberInfo>()); 

foreach (MemberInfo mi in all) 
{ 
    //some code 
} 
1

要把它们放到一个循环中:

foreach (MemberInfo member in fields.Cast<MemberInfo>().Concat(props)) 
{ 
    //I'm 100% sure this isn't what you want 
    //because you need to set value here 
    //in this case, you still need to check if member is a FieldInfo/PropertyInfo 
    //and then convert it before you set the values 
} 

实际上,在这里使用两个循环可能会更好。首先,代码看起来更清晰,因为它们做着不同的事情,一个设置字段值,另一个设置属性值。其次,注册缓存可能有助于使你的程序比一个循环快一点。

+0

Nop,我只会从字段/属性中获取(阅读)信息!应该这样工作,我会尝试 –

0

嗯......

这种迭代是放松字段和属性的顺序。 例如

class Test 
{ 
    public String tests { get; set; } 
    public int testi; 
} 

如果GetFields如果得到第一 - 我们得到“TESTI”作为第一memberm并通过GetProperies我们得到的“测试”。 联盟可能会合并它们,但订单不会保留。

有没有办法获得字段和属性并保持它们的顺序?