gpt4 book ai didi

c# - 如何获得一个 System.Collections.Generic.List ,它包含类型 T 对象的所有 FieldInfo,直到类层次结构中的对象?

转载 作者:太空宇宙 更新时间:2023-11-03 20:45:35 26 4
gpt4 key购买 nike

我正在尝试重用现有代码……但没有成功。这是代码片段:

using System;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.Text;
using System.Reflection;

namespace GenApp.Utils.Reflection
{
class FieldTraverser
{


public static string SearchFieldValue(object obj, int MaxLevel, string strFieldMeta , ref object fieldValue)
{
if (obj == null)
return null;
else
{
StringBuilder sb = new StringBuilder();
bool flagShouldStop = false;
FieldTraverser.PrivDump(sb, obj, "[ObjectToDump]", 0, MaxLevel , ref flagShouldStop , ref fieldValue);
return sb.ToString();
}
} //eof method



public static object GetFieldValue(object obj, string fieldName, ref bool flagShouldStop, ref object objFieldValue)
{
FieldInfo fi;
Type t;

t = obj.GetType();
fi = t.GetField(fieldName, BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);
if (fi == null)
return null;
else
{

if (fi.Name.Equals(fieldName))
{
objFieldValue = fi.GetValue(obj);
flagShouldStop = true;
}
return fi.GetValue(obj);
} //eof else
} //eof method


protected static void DumpType(string InitialStr, StringBuilder sb, object obj,
int level, System.Type t, int maxlevel , ref bool flagShouldStop , ref object objFieldValue
)
{
FieldInfo[] fi;
fi = t.GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);
if (t == typeof(System.Delegate)) return;
foreach (FieldInfo f in fi)
{
PrivDump(sb, f.GetValue(obj), f.Name, level + 1, maxlevel , ref flagShouldStop , ref objFieldValue);
if (flagShouldStop == true)
return;
}
object[] arl;
int i;
if (obj is System.Array)
{
try
{
arl = (object[])obj;
for (i = 0; i < arl.GetLength(0); i++)
{
PrivDump(sb, arl[i], "[" + i + "]", level + 1, maxlevel, ref flagShouldStop, ref objFieldValue);
if (flagShouldStop == true)
return;
}
}
catch (Exception) { }
}
}




protected static void PrivDump(StringBuilder sb, object obj, string objName, int level, int MaxLevel, ref bool flagShouldStop, ref object objFieldValue)
{

if (obj == null)
return;
if (MaxLevel >= 0 && level >= MaxLevel)
return;

string padstr;
padstr = "";
for (int i = 0; i < level; i++)
if (i < level - 1)
padstr += "|";
else
padstr += "+";
string str;
string[] strarr;
Type t;
t = obj.GetType();
strarr = new String[7];
strarr[0] = padstr;
strarr[1] = objName;
strarr[2] = " AS ";
strarr[3] = t.FullName;
strarr[4] = " = ";
strarr[5] = obj.ToString();
strarr[6] = "\r\n";
sb.Append(String.Concat(strarr));
if (obj.GetType().BaseType == typeof(ValueType))
return;
FieldTraverser.DumpType(padstr, sb, obj, level, t, MaxLevel, ref flagShouldStop , ref objFieldValue);
Type bt;
bt = t.BaseType;
if (bt != null)
{
while (!(bt == typeof(Object)))
{
str = bt.FullName;
sb.Append(padstr + "(" + str + ")\r\n");
FieldTraverser.DumpType(padstr, sb, obj, level, bt, MaxLevel , ref flagShouldStop , ref objFieldValue);
bt = bt.BaseType;
if (bt != null)
continue;
break;
} while (bt != typeof(Object)) ;
}
} //eof method
}//eof class
} //eof namespace

最佳答案

请注意,您很少需要弄乱 FieldInfo;字段很少公开,您通常应该使用 PropertyInfo (GetProperties())。但是,GetFields 将起作用。对于公共(public)字段,只需 GetFields();对于私有(private)字段,您也需要 BindingFlags:

class Foo {
public string abc;
}
class Bar : Foo {
private int def;
}
static class Program {
static void Main() {
object obj = new Bar();
FieldInfo[] fields = obj.GetType().GetFields(
BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);

foreach(FieldInfo field in fields) {
Console.WriteLine(field.Name + " = " + field.GetValue(obj));
}
}
}

关于c# - 如何获得一个 System.Collections.Generic.List<FieldInfo> ,它包含类型 T 对象的所有 FieldInfo,直到类层次结构中的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1006192/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com