0

我正在处理的项目中有许多类,以简化处理需要读入和读出文本文件并分配给程序中的数据对象的数据。我需要编写一个方法来获取这些类中的任何一个并返回值的 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,因此该方法返回一个空白字符串。关于我可能需要做些什么来完成这项工作的任何想法?

编辑代码块以反映以下建议。

4

2 回答 2

2

我认为您缺少获取属性的代码行(并初始化您的字段变量)

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

于 2013-01-25T16:14:51.377 回答
1

你可能想做一些更像这样的事情:

   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() 已修复。

于 2013-01-25T16:43:21.720 回答