C# 使用泛型类型对象的反射获取属性

C# 使用泛型类型对象的反射获取属性,c#,generics,reflection,C#,Generics,Reflection,我有一个泛型类,在其中我有一个函数来获取传递的泛型对象的属性 public class ExportToCsv<T> where T: class { public ExportToCsv(List<T> obj) { this.Data = obj; } public StringBuilder CreateRows() { IEnumerable

我有一个泛型类,在其中我有一个函数来获取传递的泛型对象的属性

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

    public StringBuilder CreateRows()
   {
       IEnumerable<PropertyInfo> properties = typeof(T).GetProperties();
   }
}
并将该结果作为
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; }
    }
所以在这种情况下,它不起作用,我选择第一条记录并获得如下属性

//GetLeadingRoutingRecords returns a class/object
var result = from obj in GetLeadRoutingRecords()
                    select new
                    {
                        LeadRoutingId = obj.LeadRoutingID,
                        Make = obj.Make
                     };
this.Data.First().GetType().GetProperties();
我想在这里使用第一种模式,即
type(T).GetProperties

因此,任何解决方法都可以很好地解决
typeof(T)
的问题;下面是一个基于您的示例的简单示例,但(重要的)是可运行的。它输出:

ShopName
TargetVehicleName
代码:

使用系统;
使用System.Collections.Generic;
公共类CsvReport
{
公共字符串ShopName{get;set;}
公共字符串TargetVehicleName{get;set;}
}
类ExportToCsv
{
列出数据;
公共出口货物目录(清单obj)
{
数据=obj;
}
public void WritePropNames()
{
foreach(typeof(T).GetProperties()中的var prop)
{
控制台写入线(道具名称);
}
}
}
静态类程序
{
静态void Main()
{
var obj=新列表();
对象添加(新CsvReport{ShopName=“Foo”,TargetVehicleName=“Bar”});
新的ExportToCsv(obj).WritePropNames();
}
}

你的“下面的代码”没有多大意义,这使得评论有点困难——还有你的“匿名对象”。。。不是匿名的:它是一个
CsvReport
。你能澄清一下吗?理想情况下显示实际调用的代码
ExportToCsv
?另外:
this.Data
是如何声明的?请提供较小的示例,这样更容易关注问题您如何实例化您的
ExportToCsv
?您发布的是实际使用的代码吗?我可以想象,在
ExportToCsv
构造函数中使用了类似于
IEnumerable
的东西,而不是
List
,然后使用基类而不是具体的派生类型对其进行实例化。例如:
newexporttocsv(myCollectionOfCsvReports)
。这将导致它查找基本类型
T
object
,在这种情况下,它不会产生任何可用的属性),其中,访问第一项并调用
GetType()
它将为您提供
CsvReport
类型,该类型将生成您的属性。我正在执行与您相同的操作,但它对我无效,它将返回“System.PropertyInfo[0]”我没有返回属性。谢谢,我修复了我的代码中缺少类型推断的问题,这就是为什么它不起作用的原因,即使我做了和你一样的事情,我真的很感谢你对帮助我的兴趣。。。。。。。。
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();
    }
}