【问题标题】:get properties using reflections for generic type object使用泛型类型对象的反射获取属性
【发布时间】:2013-08-08 21:08:51
【问题描述】:

我有一个泛型类,其中我有一个函数来获取传递的泛型对象的属性。如下所示。

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

所以,请解决任何问题............

【问题讨论】:

  • 你的“下面的代码”没有多大意义,这使得评论有点困难 - 而你的“匿名对象”...... 不是匿名的 :它是CsvReport。你能澄清一下吗?理想情况下显示您实际调用ExportToCsv 的代码?另外:this.Data 是如何声明的?
  • 请提供更小的例子,这样更容易专注于问题
  • 你是如何实例化你的ExportToCsv&lt;CsvReport&gt;的?
  • 您发布的代码是实际使用的吗?我可以想象你有类似IEnumerable&lt;T&gt;ExportToCsv 构造函数,而不是List&lt;T&gt;,然后用基类而不是具体的派生类型实例化它。例如:new ExportToCsv&lt;object&gt;(myCollectionOfCsvReports)。这将导致它在基本类型T 上查找属性(在这种情况下object 不会产生任何可用的东西),其中访问第一项并在其上调用GetType() 会给你@987654339 @type 这会产生你的属性。

标签: c# generics reflection


【解决方案1】:

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();
    }
}

【讨论】:

  • 我正在做与你相同的事情,但它对我不起作用,它返回“System.PropertyInfo[0]”而不是返回属性。
  • 谢谢我解决了我的代码中缺少一些类型推断的问题,这就是为什么即使我做了和你一样的事情它也不起作用的原因,我真的很感谢你有兴趣帮助我..... ...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-05-10
  • 2018-06-05
  • 2012-09-23
  • 1970-01-01
  • 1970-01-01
  • 2023-03-28
  • 1970-01-01
相关资源
最近更新 更多