需要编写 c# 方法,将我创建的泛型类作为参数并解析出属性的值
本文关键字:参数 属性 泛型类 方法 创建 | 更新日期: 2023-09-27 17:55:56
我正在处理的项目中有许多类,以简化处理需要读入和读出文本文件的数据,并分配给程序中的数据对象。我需要编写一个方法来获取这些类中的任何一个并返回值的 csv 字符串。同样,我希望能够返回属性名称的 csv 字符串。我可以为每个类编写特定的方法,但我试图以一种只有一种方法来执行此操作的方式进行。
示例类:
public class Student
{
public string StudentID;
public string Form;
public string ScaleForm;
public double Totalscore;
public double MatrixRawScore;
public double ScaleScore;
public double Theta;
public int PerformanceLevel;
public double LowScaleScore;
public double HighScalescore;
public string AdminID;
public string Group;
public int GroupIndex;
public string ResponseVector;
}
这是我为实现目标所做的努力,但这显然不起作用:
public static string ObjectToCsv<T>(T myObject)
{
var fields = typeof(T).GetProperties();
var objectString = "";
foreach (PropertyInfo prop in fields)
{
objectString = prop.GetValue(myObject, null).ToString() + ',';
}
objectString.TrimEnd(',');
return objectString;
}
当我的代码运行此方法时,PropertyInfo[] 的长度为 0,没有 PropertyInfo,因此该方法返回一个空白字符串。关于我可能需要做什么才能完成这项工作的任何想法?
编辑了代码块以反映下面的建议。
我认为您缺少获取属性(并初始化字段变量)的代码行
typeof(T).GetProperties();
在您的情况下,您需要添加以下内容:
var fields = myObject.GetType().GetProperties();
我会使你的类中的字段成为自动属性,如下所示:
public class Student
{
public string StudentID { get; set;}
public string Form { get ; set;}
...
}
请记住,GetProperties()
方法都有一个重载,该重载获取BindingFlags
以在返回的属性上添加约束。
必须指定 BindingFlags.Instance 或 BindingFlags.Static 才能获得返回。
指定 BindingFlags.Public 以在搜索中包含公共属性。
指定 BindingFlags.NonPublic 以在搜索中包括非公共属性(即私有、内部和受保护的属性)。仅返回基类上的受保护属性和内部属性;不返回基类上的私有属性。
指定 BindingFlags.FlattenHierarchy 以将公共和受保护的静态成员包括在层次结构中;不包括继承类中的私有静态成员。
BindingFlags.DeclaredOnly 仅搜索在 Type 上声明的属性,而不搜索仅继承的属性
http://msdn.microsoft.com/en-GB/library/kyaxdd3x.aspx
你可能想做一些更像这样的事情:
public static string ObjectToCsv<T>(T myObject)
{
var objectString = "";
foreach (FieldInfo field in typeof(T).GetFields())
{
objectString += field.GetValue(myObject).ToString() + ',';
}
return objectString.TrimEnd(',');
}
从您发布的内容来看,您似乎正在处理字段,而不是属性。此外,您需要 += 您的字符串而不是设置其值,否则每次向它提供新字段时都会覆盖它。出于某种原因,TrimEnd() 对我不起作用,但我会把它留在那里。祝你好运!
编辑:TrimEnd()修复。