gpt4 book ai didi

c# - 查找对象的所有属性和子属性

转载 作者:行者123 更新时间:2023-11-30 14:39:54 25 4
gpt4 key购买 nike

有时我想知道一个对象是否有我正在寻找的属性,但有时一个对象有很多属性,可能需要一些时间才能找到它调试它。如果我可以编写一个函数来查找字符串中的所有属性及其值,然后我可以将该字符串粘贴到记事本中,然后使用记事本具有的查找功能查找我正在查找的值,那就太好了。到目前为止,我有这样的事情:

public void getAllPropertiesAndSubProperties(System.Reflection.PropertyInfo[] properties)
{
foreach (var a in properties)
{
//MessageBox.Show(a.ToString());
// do something here to test if property a is the one
// I am looking for
System.Reflection.PropertyInfo[] temp = a.GetType().GetProperties();
// if property a has properties then call the function again
if (temp.Length > 0) getAllPropertiesAndSubProperties(temp);
}
}

编辑我做过的问题:

到目前为止,我已经添加了以下代码。我可以将我想要的任何对象传递给以下方法,我可以看到所有属性。我在查看属性值时遇到问题

![public void stackOverex(dynamic obj)
{
// this is the string where I am apending all properties
string stringProperties = "";

Type t = obj.GetType();
List<PropertyInfo> l = new List<PropertyInfo>();
while (t != typeof(object))
{
l.AddRange(t.GetProperties());
t = t.BaseType;

var properites = t.GetType().GetProperties();
foreach (var p in properites)
{
string val = "";
try
{
val = obj.GetType().GetProperty(p.Name).GetValue(obj, null).ToString();
}
catch
{

}
stringProperties += p.Name + " - " + val + "\r\n";
}

}

MessageBox.Show(stringProperties);
}

enter image description here

是的,visual studio 调试器很棒,但看看一个对象可以拥有多少属性。我实际上是在寻找 gridViewColumnHeader 的 indexSomething 属性我不记得确切的名称我只记得我以前使用过它。我有一个事件在单击列时触发,我想知道索引而不是名称“列号 2?或 3 被单击”。我知道我可以通过名称获取它,但如果我可以实现此调试器功能,那就太好了。在下图中查看它的复杂程度。

enter image description here

最佳答案

如果您想要包括基本类型在内的所有属性,那么您可以这样做:

        Type t = typeof(AnyType);
List<PropertyInfo> l = new List<PropertyInfo>();
while (t != typeof(object))
{
l.AddRange(t.GetProperties());
t = t.BaseType;
}

或者您可能想要递归打印属性,直到一个级别:

    public static void ReadALotOfValues(StringBuilder b, object o, int lvl, int maxLvl)
{
Type t = o.GetType();
List<PropertyInfo> l = new List<PropertyInfo>();
while (t != typeof(object))
{
l.AddRange(t.GetProperties());
t = t.BaseType;
}
foreach (var item in l)
{
if (item.CanRead && item.GetIndexParameters().Length == 0)
{
object child = item.GetValue(o, null);
b.AppendFormat("{0}{1} = {2}\n", new string(' ', 4 * lvl), item.Name, child);
if (lvl < maxLvl)
ReadALotOfValues(b, child, lvl + 1, maxLvl);

}
}
}

编辑:调用上述方法:

object o = ...some object here...;
var b = new StringBuilder();
ReadALotOfValues(b, o, 0, 5);
Console.WriteLine(b.ToString());

上面的代码会将最多 5 层深度的属性读取到对象中。

必须以某种方式限制搜索,否则它会永远循环......想想一个自引用对象。

关于c# - 查找对象的所有属性和子属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5958803/

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