2016-09-13 7 views
0

以下のユーティリティ機能(データテーブルへのリスト)では、どのようにリストのメンバーを除外できますか?いくつかのリストプロパティを除外してデータテーブルを作成する方法

などが、私は、属性を作成し、以下のユーティリティメソッドに

public class PointDataClone 
{ 
    public int DataId { get; set; } 
    public string UniqueKey { get; set; } 
    public int Count { get; set; } 
    public List<PointToPointData> PointToPointData { get; set; } 
} 

ユーティリティ機能、

public static DataTable ToDataTable<T>(this List<T> iList) 
    { 
     DataTable dataTable = new DataTable(); 
     PropertyDescriptorCollection propertyDescriptorCollection = TypeDescriptor.GetProperties(typeof(T)); 
     for (int i = 0; i < propertyDescriptorCollection.Count; i++) 
     { 
      PropertyDescriptor propertyDescriptor = propertyDescriptorCollection[i]; 
      Type type = propertyDescriptor.PropertyType; 

      if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>)) 
       type = Nullable.GetUnderlyingType(type); 

      dataTable.Columns.Add(propertyDescriptor.Name, type); 
     } 
     object[] values = new object[propertyDescriptorCollection.Count]; 
     foreach (T iListItem in iList) 
     { 
      for (int i = 0; i < values.Length; i++) 
      { 
       values[i] = propertyDescriptorCollection[i].GetValue(iListItem); 
      } 
      dataTable.Rows.Add(values); 
     } 
     return dataTable; 
    } 
+0

に役立ちます。 –

+0

優れたアイデア、任意のサンプルコード – user584018

+0

使用時:dataTable.Rows.Add(values);配列 'values'は、データテーブル内の列と同じ順序でなければなりません。値には、データテーブルに8列が含まれている場合、データテーブルの最初の5列を含めることができます。データテーブルの最後の3列はNULLで埋められます。フィールド型がNULLを許可しない場合、nullを使用してエラーを取得することがあります。 UniqueKeyおよび/またはPointToPointDataが配列の途中にある場合、コードに問題があります。私は通常、次のdataTable.Rows.Add(新しいオブジェクト[] {input1、input2、input5、input6、input10})を使用します。 – jdweng

答えて

0

を2つのプロパティ "UNIQUEKEY" & "PointToPointData" を送信したくない

[AttributeUsage(AttributeTargets.Method | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Parameter, AllowMultiple = false)] 
public class DontShowMe : Attribute 
{ 
} 

この属性を使用すると、クラスに注釈を付けることができます

public class PointDataClone 
{ 
    public int DataId { get; set; } 
    [DontShowMe] 
    public string UniqueKey { get; set; } 
    public int Count { get; set; } 
    [DontShowMe] 
    public List<PointToPointData> PointToPointData { get; set; } 
} 

属性を照会するように関数を変更してください。あなたは

if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>)) type = Nullable.GetUnderlyingType(type); 

// test attribute to see if it is shown 
if (propertyDescriptor.Attributes.Contains(new DontShowMe())) continue; 

dataTable.Columns.Add(propertyDescriptor.Name, type); 

あなたのループに次の行を追加します

using System.ComponentModel; 

追加usingステートメントが必要になります今、あなたのオブジェクトは、データテーブルに列を持っているよりも多くの性質を持っているという事実に対処する必要があります。私はあなたにその小さな詳細を管理するためにそれを残します。

希望これは、あなたがあなたのクラスでデータ注釈を使用して、あなたのためのループでそれらをテストし、あなたがこれらの注釈を持つプロパティに遭遇したとき、継続することができるかもしれません

マルク・

+0

ありがとうございました! – user584018

関連する問題