2010-04-26 3 views
1

IEnumerable 매개 변수에서 Excel 파일로 값을 내보내는 메서드를 작성했습니다. 메서드는 내 작은 테스트 클래스에서 잘 작동했으며 나는 LINQ 클래스로 내 메서드를 테스트 할 때까지 행복했습니다.LINQ 생성 클래스와 IEnumerable에서 Excel로 문제가 발생했습니다.

방법 :

public static void IEnumerableToExcel<T>(IEnumerable<T> data, HttpResponse Response) 
    { 
     Response.Clear(); 
     Response.ContentEncoding = System.Text.Encoding.Default; 
     Response.Charset = "windows-1254"; 
     // set MIME type to be Excel file. 
     Response.ContentType = "application/vnd.ms-excel;charset=windows-1254"; 
     // add a header to response to force download (specifying filename) 
     Response.AddHeader("Content-Disposition", "attachment;filename=\"ResultFile.xls\""); 

     Type typeOfT = typeof(T); 
     List<string> result = new List<string>(); 

     FieldInfo[] fields = typeOfT.GetFields(); 
     foreach (FieldInfo info in fields) 
     { 
      result.Add(info.Name);    
     } 

     Response.Write(String.Join("\t", result.ToArray()) + "\n"); 

     foreach (T t in data) 
     { 
      result.Clear(); 
      foreach (FieldInfo f in fields) 
       result.Add((typeOfT).GetField(f.Name).GetValue(t).ToString()); 
      Response.Write(String.Join("\t", result.ToArray()) + "\n"); 
     } 
     Response.End(); 
    } 

나의 작은 시험 등급 :

public class Mehmet 
{ 
    public string FirstName; 
    public string LastName;  
} 

두 사용법 :

성공 :

Mehmet newMehmet = new Mehmet(); 
     newMehmet.FirstName = "Mehmet"; 
     newMehmet.LastName = "Altiparmak"; 
     List<Mehmet> list = new List<Mehmet>(); 
     list.Add(newMehmet); 
     DeveloperUtility.Export.IEnumerableToExcel<Mehmet>(list, Response); 

실패 :

오류 이유 : 코드가 템플릿 필드를 가져 오는 데 사용 된 코드 블록 (T)에 도달하면 LINQ 생성 된 사용자 클래스에 대한 필드를 찾을 수 없습니다. 나의 이상한 클래스를 위해 그것은 잘 작동한다.

왜?

감사합니다 ... 샘플 클래스는 public 필드의 데이터를 노출하면서, 민간 분야의 데이터 (그의 이름은 밑줄로 시작) SQL 저장소에 LINQ에 의해 생성

답변

0

클래스. 사용중인 GetFields 메서드의 오버로드는 공용 필드 만 반환하므로 클래스에 사용할 수 있지만 LINQ to SQL 생성 클래스에는 사용할 수 없습니다.

.NET에서 좋은 방법은 데이터를 공용 속성으로 표시하는 것이므로 필드를 사용하는 것에서 속성으로 전환하는 것이 가장 좋습니다. GetFieldsGetProperties (PropertyInfo[]을 반환)으로 변경해야합니다. 그런 다음 SQL 클래스를 생성에 LINQ를 위해 일을하고이 같은 쓰기 클래스 (C#을 3.0에서 자동 속성을 사용) 것입니다 :

public class Mehmet { 
    public string FirstName { get; set; } 
    public string LastName { get; set; }  
} 

또는 둘 다 GetFieldsGetProperties을 사용할 수 있지만, 잘 설계된 클래스 이후 공개 입력란을 포함해서는 안되며 필요하지 않아야합니다.

또한, 귀하의 중첩 된 foreach는 약간 이상한 방식으로 GetField를 사용 PropertyInfo를 들어,이 같은 모양

foreach (FieldInfo f in fields) 
    result.Add((typeOfT).GetField(f.Name).GetValue(t).ToString()); 

// You don't need 'GetFied' because 'f' is the field you're looking for: 

foreach (FieldInfo f in fields) 
    result.Add(f.GetValue(t).ToString()); 

(만 대신 PropertyInfo 사용합니다).

관련 문제