0

私が取り組んでいるプロジェクトには、テキストファイルの読み取りと読み取り、およびプログラム内のデータオブジェクトへの割り当てが必要なデータの操作を簡素化するために、いくつかのクラスがあります。これらのクラスのいずれかを取得して、値のcsv文字列を返すメソッドを作成する必要があります。同様に、プロパティ名のcsv文字列を返すことができるようにしたいと思います。クラスごとに特定のメソッドを作成することもできますが、これを実行するメソッドが1つしかない方法で、これを一般的に実行しようとしています。

クラスの例:

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は、単純に継承されたプロパティではなく、タイプで宣言されたプロパティのみを検索します

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 に答える