繁体   English   中英

需要编写一个以我创建的通用类作为参数并解析出属性值的c#方法

[英]Need to write c# method taking a generic class I create as an argument and parsing out th values of the Properties

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

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

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

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在搜索中包括非公共属性(即私有,内部和受保护的属性)。 只返回基类上的protected和internal属性; 不返回基类上的私有属性。

  • 指定BindingFlags.FlattenHierarchy将公共成员和受保护的静态成员包括在层次结构中; 不包括继承类中的私有静态成员。

  • BindingFlags.DeclaredOnly仅用于搜索在Type上声明的属性,而不是仅继承的属性

http://msdn.microsoft.com/zh-CN/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()已修复。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM