17

渡されたジェネリックオブジェクトのプロパティを取得する関数を持つジェネリッククラスがあります。以下のとおりです。

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 CsvReport function return(){
    return new CsvReport
                {
                    ShopName = this.val,
                    TargetVehicleName = val
                 }.ToList();
}

上記の匿名オブジェクト用に作成したクラスは次のようになります。

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

したがって、この場合は機能しません。最初のレコードを選択して、以下のようなプロパティを取得しています

this.Data.First().GetType().GetProperties();

ここでも最初のパターンを使いたいのですが、type(T).GetProperties

それで、回避策をお願いします..................................

4

1 に答える 1

32

リフレクションは正常にtypeof(T)機能します。これはあなたのものに基づくより簡単な例ですが、(重要なことに) runnableです。以下を出力します。

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();
    }
}
于 2013-08-08T13:08:51.853 に答える