2013-08-08 37 views
13

Tôi đang có một lớp chung mà trong đó tôi có một hàm để lấy các đặc tính của đối tượng chung được truyền. Nó như sau.lấy các thuộc tính sử dụng phản xạ cho đối tượng kiểu chung

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

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

Nó hoạt động tốt và trả về cho tôi tính nếu tôi vượt qua các đối tượng bằng cách chọn từ một đối tượng (class) như dưới đây

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

và vượt qua kết quả đó như result.ToList();

nhưng khi tôi cố gắng để tạo đối tượng ẩn danh của riêng tôi bằng cách tạo lớp cho các thuộc tính như bên dưới, nó không hoạt động không trả lại bất kỳ thuộc tính nào

Lưu ý: mã dưới đây đang được gọi trong một vòng lặp và nó hoạt động tốt và được chuyển đến hàm trên có thể thấy tất cả các giá trị bằng cách gỡ lỗi.

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

lớp mà tôi đã viết cho đối tượng ẩn danh ở trên là như dưới đây:

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

như vậy trong trường hợp này nó không làm việc, tôi đang chọn ghi đầu tiên và nhận được các thuộc tính như dưới đây

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

Tôi muốn sử dụng mẫu đầu tiên ngay cả ở đây, là type(T).GetProperties

Vì vậy, mọi công việc xung quanh xin vui lòng ........................

+1

của bạn "vào mã bên dưới" không có ý nghĩa nhiều, mà làm cho nó một chút khó khăn để bình luận - và "đối tượng ẩn danh" của bạn ... * không phải là vô danh *: nó là một 'CsvReport'. Bạn có thể làm rõ? Hiển thị lý tưởng mã mà bạn thực sự gọi là 'ExportToCsv'? Ngoài ra: 'this.Data' được khai báo như thế nào? –

+1

vui lòng cung cấp ví dụ nhỏ hơn, sau đó dễ tập trung hơn vào vấn đề – lordkain

+0

Làm thế nào để bạn khởi tạo 'ExportToCsv '? –

Trả lời

25

Phản ánh trên typeof(T) hoạt động tốt; đây là ví dụ đơn giản hơn dựa trên trên máy của bạn, nhưng (quan trọng) runnable. Nó ra:

ShopName 
TargetVehicleName 

mã:

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

Tôi đang làm cùng một công cụ mà bạn đã làm nhưng nó không làm việc cho tôi nó được trả về "System.PropertyInfo [0]" thay vì trả lại tài sản. – user2486535

+0

cảm ơn tôi đã khắc phục vấn đề ở đó một số suy luận kiểu thiếu trong mã của tôi đó là lý do tại sao nó không hoạt động ngay cả khi tôi đã làm những thứ giống như bạn đã làm, tôi thực sự đánh giá cao sự quan tâm của bạn trong việc giúp tôi ........ – user2486535

Các vấn đề liên quan