首先,如果这个问题对网站上的其他信息是多余的,请原谅我。我已经查看了有关反射的其他帖子,但似乎对我正在做的事情没有任何意义。
我们的想法是将方法传递给一个类,然后遍历该对象属性并将其值赋给返回值。稍后将使用返回值来动态创建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;
}
答案 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();
显然,如果您需要特定的格式,您可以在添加到列表之前执行此操作。