需要编写 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,因此该方法返回一个空白字符串。关于我可能需要做什么才能完成这项工作的任何想法?

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

需要编写 c# 方法,将我创建的泛型类作为参数并解析出属性的值

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

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