如何遍历传递给方法的类并在C#中检索它的属性值?

时间:2014-03-07 19:52:03

标签: c# reflection

首先,如果这个问题对网站上的其他信息是多余的,请原谅我。我已经查看了有关反射的其他帖子,但似乎对我正在做的事情没有任何意义。

我们的想法是将方法传递给一个类,然后遍历该对象属性并将其值赋给返回值。稍后将使用返回值来动态创建SQL语句。我使用PropertyInfo创建了循环,并且我能够根据switch语句告诉属性的类型。问题是,一旦我处于属性的特定情况,我就很难弄清楚如何将该特定属性值分配给稍后要返回的列表。这是我的代码,提前感谢任何帮助。

    public List<string> BuildParametersFromObject(clsBook oBook, clsStudent oStud)
    {
        List<string> lstRetVal = new List<string>();
        string sTemp = "";
        string sPropType = "";
        int ii;
        if (oBook == null)
        {
            PropertyInfo[] ObjProperties = typeof(clsStudent).GetProperties();
            foreach (PropertyInfo StudProp in ObjProperties)
            {
                ii = 0;
                sPropType = Convert.ToString(StudProp.PropertyType);
                switch (sPropType)
                {
                    case "System.String":
                        lstRetVal.Add(StudProp.GetValue(clsStudent, null));
                        break;
                    case "System.Int32":

                        break;
                    case "System.Decimal":

                        break;
                    case "System.Boolean":

                        break;
                    case "System.DateTime":

                        break;
                }

            }
        }
        return lstRetVal;
    }

2 个答案:

答案 0 :(得分:2)

您的代码无法编译,因为

StudProp.GetValue(clsStudent, null)

要求它的第一个参数是一个对象,并且你给那个方法最可靠的是一个类符号。

其次,我试图理解你打算用两个参数做什么:

  • clsBook oBook
  • clsStudent oStud

根据您在那里写的内容,我了解如果oBook不为空,那么您可以将结果添加到返回列表中。我现在就把它留在那里。

第二大问号是您是否需要oStud参数。

假设您解决了编译问题,并且您的代码执行编译。 如果您尝试完全删除参数,即

public List<string> BuildParametersFromObject(clsBook oBook, clsStudent oStud)

变为

public List<string> BuildParametersFromObject(clsBook oBook)

您会注意到您的方法仍在编译,因此您没有使用oStud

您正在枚举clsStudent

的属性

如果您不确定我在说什么,那么您可以简单地执行以下操作:

<强> MODIFICATIONS

// prepare your little filter
private static readonly Type[] allowedTypes = new Type[] { 
    typeof(bool), typeof(string), typeof(int), 
    typeof(decimal), typeof(DateTime)
};

public List<string> BuildParametersFromObject(clsBook oBook, clsStudent oStud)
{
    List<string> lstRetVal = new List<string>();
    string sTemp = "";
    string sPropType = "";
    int ii;
    if (oBook == null)
    {

        PropertyInfo[] ObjProperties = typeof(clsStudent).GetProperties();
        foreach (PropertyInfo StudProp in ObjProperties)
        {
            // if the property's type is not one of the 5 magnificence
            // simply jump to the next cycle of the foreach loop
            if (!allowedTypes.Contains(StudProp.PropertyType)) 
                continue;

            object pureValue = StudProp.GetValue(oStud);
            // what you were using is not ok: StudProp.GetValue(clsStudent)
            // because you're trying to retrieve the value of a property
            // defined by the clsStudent class
            // and in the process you also need to point out an instance
            // of that particular class, but instead of doing that
            // you were pointing out an instance of Type i.e. clsStudent itself

            string stringValue = pureValue + "";
            // simply concatenate the pureValue with a blank string
            // (allowing imminent nulls to be displayed as empty strings instead of crashing your thread with NullReferenceException)

            lstRetVal.Add(stringValue);
            // just add your stringified value to the list

        }


    }
    return lstRetVal;
}

<强>说明

我所做的是我已经将您的显式过滤(使用开关)修改为基本数组(您希望在添加结果时支持的类型列表)以及我还删除了不必要的并且完全难以维护类型的“名称比较”。比较类型本身比较清晰:自己。世界上可以有RunninThruLife,但其中只有一个是你。

最大的错误是,不是从clsStudent实例获取属性的值,而是从clsStudent本身(这是一个类)获取它们。

答案 1 :(得分:1)

在其他每种情况下,只需在GetValue()的结果上调用ToString()。

StudProp.GetValue(oStud, null).ToString();

显然,如果您需要特定的格式,您可以在添加到列表之前执行此操作。