質問

Visual Studio 2012で.NET 4.0、C#4.0を使用して、コードファーストとエンティティフレームワークを使用しています。

さまざまなレポートの基礎として使用したいクラスのセットがあります。レポートのデータはSQLデータベースに保持されています。例のクラスは次のとおりです。

public class DocumentTrackerChaseReport
{
    public int DocumentTrackerChaseReportID { get; set; }
    public int CaseID { get; set; }
    public int DocumentID { get; set; }

    [Description("Case ID")]
    public String CaseIdentifier { get; set; }
    [Description("Document type")]
    public String DocumentCategory { get; set; }
    [Description("Contact")]
    public String ContactName { get; set; }
    [Description("Phone number")]
    public String ContactPhoneNumber { get; set; }
    [Description("email address")]
    public String ContactEmail { get; set; }

    public TrackingActionType TrackingActionType { get; set; }
}

説明属性は、レポートのヘッダーとして機能し、どのプロパティがレポートから除外されるかを示すために機能します。

ヘッダーをからの文字列アレイとして抽出する方法があります これ 質問

また、フィールド/プロパティに説明属性があるかどうかを確認するメソッドを生成することもできます。

私が欠けている重要な成分は、この属性を持たないフィールドを省略したレポートの各行を生成するための簡単で一般的な方法です。レポートの各行の属性を反射とチェックすることを使用して、すべてのフィールドを繰り返すことができますが、それは長く巻き込まれているようです。

これにエレガントな解決策はありますか?

役に立ちましたか?

解決

興味のあるプロパティの名前(すなわち、説明属性を持つもの)の名前を事前にキャッシュし、それらを使用して、興味のある値のみをつかむことができます。

私はこの簡単な例をまとめてハッキングしましたが、それは最も堅牢なコードではありませんが、一般的なアイデア(注文について多くの仮定を立てます)を示し、属性を一度だけ取得しました。

(編集:すべてに対して一度GetPropertiesを呼び出す必要があることに気付きました)。

var whitelist = typeof (DocumentTrackerChaseReport)
    .GetProperties()
    .Where(x => Attribute.IsDefined(x, typeof (DescriptionAttribute)));

var rows = things.Select(x => whitelist.Select(y => y.GetValue(x) ?? ""));

これはあなたに与えます IEnumerable<IEnumerable<object>>, 、または言い換えれば、行と各行のリスト、列のリスト(各列の値はオブジェクトです)。

次に、これを次のように反復させることができます(擬似コード)

foreach (var header in whitelist) {
    // print column of header row
}

foreach (var row in rows) {
    foreach (var col in row) {
        // print an individual cell
    }
    // break for a new row
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top