Pat*_*ick 25 c# reflection bindingflags
我正在使用Reflection类来获取某个对象中的所有字段.然而,我的问题是,当字段在普通类中时,它可以正常工作,例如:
class test
{
string test1 = string.Empty;
string test2 = string.Empty;
}
Run Code Online (Sandbox Code Playgroud)
在这里我得到test1和test2,我的问题是我使用抽象,因此结合了几个类.
我有类似的东西:
class test3 : test2
{
string test4 = string.Empty;
string test5 = string.Empty;
}
class test2 : test1
{
string test2 = string.Empty;
string test3 = string.Empty;
}
class test1
{
string test0 = string.Empty;
string test1 = string.Empty;
}
Run Code Online (Sandbox Code Playgroud)
但是,当我运行它时,我不会从中获取字段GetType().GetFields(BindingFlag.Default).
这些领域的每个人都有get; set;附属于它的财产.当我运行代码时,我将属性一直返回到test1但不是实际的字段.
这是我试图获取字段的代码:
FieldInfo[] fields = Obj.GetType().GetFields(BindingFlags.Default);
foreach (FieldInfo field in fields)
Run Code Online (Sandbox Code Playgroud)
我也尝试过:
FieldInfo[] fields = Obj.GetType().GetFields(BindingFlags.Public
| BindingFlags.Instance
| BindingFlags.NonPublic
| BindingFlags.Static);
Run Code Online (Sandbox Code Playgroud)
我对属性使用相同的代码:
PropertyInfo[] properties = Obj.GetType().GetProperties(BindingFlags.Public
| BindingFlags.Instance
| BindingFlags.NonPublic
| BindingFlags.Static);
foreach (PropertyInfo property in properties)
Run Code Online (Sandbox Code Playgroud)
任何想法为什么我从抽象类而不是字段中获取属性?
Sam*_*ell 49
编辑:要获取基本类型的私有成员,您必须:
typeof(T).BaseType.GetFields(...)
Run Code Online (Sandbox Code Playgroud)
再次编辑:赢.
编辑3/22/13:使用Concat而不是Union.由于我们正在指定BindingFlags.DeclaredOnly并且类型BaseType不能与自身相等,Union因此不需要并且更昂贵.
public static IEnumerable<FieldInfo> GetAllFields(Type t)
{
if (t == null)
return Enumerable.Empty<FieldInfo>();
BindingFlags flags = BindingFlags.Public | BindingFlags.NonPublic |
BindingFlags.Static | BindingFlags.Instance |
BindingFlags.DeclaredOnly;
return t.GetFields(flags).Concat(GetAllFields(t.BaseType));
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
39965 次 |
| 最近记录: |