2013-08-08 13 views
13

私はジェネリックオブジェクトのプロパティを取得する関数を持つジェネリッククラスを持っています。ジェネリック型オブジェクトのリフレクションを使用してプロパティを取得します

public class ExportToCsv<T>   
     where T: class 
{ 
    public ExportToCsv(List<T> obj) 
    { 
      this.Data = obj;  
    } 

    public StringBuilder CreateRows() 
    { 
     IEnumerable<PropertyInfo> properties = typeof(T).GetProperties(); 
    } 
} 

私は

//GetLeadingRoutingRecords returns a class/object 
var result = from obj in GetLeadRoutingRecords() 
        select new 
        { 
         LeadRoutingId = obj.LeadRoutingID, 
         Make = obj.Make 
        }; 

以下のようなオブジェクト(クラス)から選択することで、オブジェクトを渡すとresult.ToList();

ように、その結​​果を渡すが、私がしようとすると場合、それは正常に動作してくれプロパティを返します。以下のようなプロパティのクラスを作成して自分自身の匿名オブジェクトを作成するには、それは動作しません任意のプロパティを返さない

注:以下のコードはループ内で呼び出され、うまく機能し、上記の関数に渡されると、デバッグによってすべての値を見ることができます。

public class CsvReport 
    { 
     public string ShopName { get; set; } 
     public string TargetVehicleName { get; set; } 
    } 

ので、この場合には、そのが働いていない、私は最初のレコードを選択し、

this.Data.First().GetType().GetProperties(); 
以下のようなプロパティを取得しています:私は上記の匿名オブジェクトのために書いた

クラスは以下のようなものです

public CsvReport function return(){ 
    return new CsvReport 
       { 
        ShopName = this.val, 
        TargetVehicleName = val 
       }.ToList(); 
} 

ここでも最初のパターンを使用します。type(T).GetProperties

だから、どんな仕事でもどうぞ........................

+1

あなたの「次のコード」コメントすることは、それは少し難しい作るこれ、あまり意味がありません - そしてあなたの「匿名オブジェクト」... *を匿名ではありません*:それは 'CsvReport'です。明確にすることはできますか?理想的には 'ExportToCsv'を実際に呼び出すコードを表示しますか?また、 'this.Data'はどのように宣言されていますか? –

+1

より小さな例を挙げてください。問題に集中するのは簡単です – lordkain

+0

'ExportToCsv 'をどのようにインスタンス化していますか? –

答えて

25

typeof(T)でのリフレクションはうまく動作します。ここではより簡単な例がですが、重要なのは実行可能です。これは、出力:

ShopName 
TargetVehicleName 

コード:

using System; 
using System.Collections.Generic; 
public class CsvReport 
{ 
    public string ShopName { get; set; } 
    public string TargetVehicleName { get; set; } 
} 
class ExportToCsv<T> 
{ 
    List<T> data; 
    public ExportToCsv(List<T> obj) 
    { 
     data = obj; 
    } 
    public void WritePropNames() 
    { 
     foreach (var prop in typeof(T).GetProperties()) 
     { 
      Console.WriteLine(prop.Name); 
     } 
    } 

} 
static class Program 
{ 
    static void Main() 
    { 
     var obj = new List<CsvReport>(); 
     obj.Add(new CsvReport { ShopName = "Foo", TargetVehicleName = "Bar" }); 
     new ExportToCsv<CsvReport>(obj).WritePropNames(); 
    } 
} 
+0

私は同じことをやっていますが、プロパティを返す代わりに "System.PropertyInfo [0]"を返しています。 – user2486535

+0

おかげさまで、私のコードで欠落しているタイプの推測が問題を解決しました。なぜなら、私は同じことをしたにもかかわらず、うまくいかなかったからです。本当にありがとうございました。 – user2486535

関連する問題