C# 使用反射查找ArrayList对象属性

C# 使用反射查找ArrayList对象属性,c#,.net,reflection,C#,.net,Reflection,我有一个对象的ArrayList,我试图使用反射来获取ArrayList中每个对象的每个属性的名称。例如: private class TestClass { private int m_IntProp; private string m_StrProp; public string StrProp { get { return m_StrProp; } set

我有一个对象的ArrayList,我试图使用反射来获取ArrayList中每个对象的每个属性的名称。例如:

private class TestClass
{
    private int m_IntProp;

    private string m_StrProp;
    public string StrProp
    {
        get
        {
            return m_StrProp;
        }

        set
        {
            m_StrProp = value;
        }
    }

    public int IntProp
    {
        get
        {
            return m_IntProp;
        }

        set
        {
            m_IntProp = value;
        }
    }
}

ArrayList al = new ArrayList();
TestClass tc1 = new TestClass();
TestClass tc2 = new TestClass();
tc1.IntProp = 5;
tc1.StrProp = "Test 1";
tc2.IntProp = 10;
tc2.StrPRop = "Test 2";
al.Add(tc1);
al.Add(tc2);

foreach (object obj in al)
{
    // Here is where I need help
    // I need to be able to read the properties
    // StrProp and IntProp. Keep in mind that
    // this ArrayList may not always contain
    // TestClass objects. It can be any object,
    // which is why I think I need to use reflection.
}

就这么简单:

PropertyInfo[] props = obj.GetType().GetProperties();

GetType方法将返回实际类型,而不是
对象
。每个
PropertyInfo
对象都有一个Name属性。

简单如下:

PropertyInfo[] props = obj.GetType().GetProperties();

GetType方法将返回实际类型,而不是
对象
。每个
PropertyInfo
对象都有一个Name属性。

您可以使用
as
操作符,这样就不必使用反射

foreach(object obj in al)
{
     var testClass = obj as TestClass;
     if (testClass != null)
     {
        //Do stuff
     }
}

您可以将
用作
操作符,这样就不必使用反射

foreach(object obj in al)
{
     var testClass = obj as TestClass;
     if (testClass != null)
     {
        //Do stuff
     }
}


您使用ArrayList而不是@dtb的原因是什么?是的,因为我的列表不一定是TestClass。它可以容纳任何对象。<代码>列表会更合适。也许你也可以考虑使用一个接口。但这当然取决于您实际使用它的情况。@spender-列表与ArrayList基本上不一样吗?另外,为了清楚起见,您使用的是ArrayList而不是?@dtb-是的,因为我的列表不一定是TestClass。它可以容纳任何对象。<代码>列表会更合适。也许你也可以考虑使用一个接口。但这当然取决于您实际使用它的情况。@spender-列表与ArrayList基本上不一样吗?另外,为了清楚起见,“请记住,此ArrayList可能并不总是包含TestClass对象。它可以是任何对象。”(从问题中)您得到了“作为TestClass”,但列表可能没有TestClass对象。它可能同时持有不同类型的对象。如果抛出TestClass对象以外的对象,则返回null,不是吗?这可能是一个很好的解决方案,也可能不是,这取决于提问者的确切意图。@Adam-但是获取null有助于实现以下目的:“获取ArrayList中每个对象的每个属性的名称。”“请记住,此ArrayList可能并不总是包含TestClass对象。它可以是任何对象,“(从问题中)您得到”作为TestClass,但列表可能没有TestClass对象。它可能同时持有不同类型的对象。如果抛出TestClass对象以外的对象,则返回null,不是吗?这可能是一个很好的解决方案,也可能不是,这取决于提问者的确切意图。@Adam-但是获取null有助于实现以下目的:“获取ArrayList中每个对象的每个属性的名称。”这可能是最好的答案。我现在就试试。谢谢。这很好。不过,Marc,唯一的一件事是,有没有办法知道该属性是字符串、int、float、decimal还是其他(以上都没有)?@ICEMAN您可以检查
prop.PropertyType
,或者更方便地检查
开关(Type.GetTypeCode(prop.PropertyType))
这是一个包含大多数常见基本类型的枚举。这可能是最好的答案。我现在就来试试。谢谢这很好。不过,Marc,唯一的一件事是,有没有办法知道该属性是字符串、int、float、decimal还是其他(以上都没有)?@ICEMANND嗯,您可以检查
prop.PropertyType
,或者更方便地检查
开关(Type.GetTypeCode(prop.PropertyType))
,这是一个包含大多数常见基本类型的枚举。