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

标签 c# reflection

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

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/

相关文章:

c# - 有没有更好的方法来 self 引用类型?

c# - 以与创建相反的顺序处理对象?

C# 到 Java - 字典?

java - 当我在 Android 应用程序中使用 Reflection api 时,性能会受到很大影响吗?

scala - 通过反射列出 Scala 嵌套对象方法

.net - 如何获取.NET中对象的全名?

c# - xxx 类型的方法 'Generate' 没有实现 - S#arp - 已更新

c# - 用户主体安全。禁用不需要的智能卡提示?

java - 如何访问 Java 方面中指定的参数?

c# - 从 Action<T> 获取参数