получать свойства с использованием отражений для объекта общего типа

У меня есть общий класс, в котором у меня есть функция для получения свойств переданного общего объекта. Это так, как показано ниже.

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

Итак, любая работа вокруг пожалуйста........................

Ответ 1

Отражение на 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();
    }
}