2015-03-31 49 views
0

我正在執行自動化使用C#作爲編程語言在運行時定義的類型列表

我有一個Enum在表中保留列。我在每個列名的「說明」中保存這些列的數據類型。

每列都可以排序,排序我想驗證特定的列的排序後是正確的。我正在列中的數據列表中,編程排序,然後在屏幕上排序,閱讀內容,然後使用List.SequenceEquals

我想創建一個「類型」的列表(如在「描述」)。但看起來我無法創建運行時對象列表。

對此的任何解決方案?

CODE

{ 
    public enum tranColumns 
    { 
     [Description("DateTime")] 
     InvoiceDate, 
     [Description("string")] 
     Customer, 
     [Description("string")] 
     InvoiceID, 
     [Description("string")] 
     LiabilityTypeDescription, 
     [Description("string")] 
     TransactionStatusDescription, 
     [Description("string")] 
     TestTransaction, 
     [Description("string")] 
     TransactionDate, 
     [Description("int")] 
     TransactionID, 
     [Description("string")] 
     SourceSystem, 
     [Description("string")] 
     ShipToGeocode, 
     [Description("DateTime")] 
     CreationTime 
    } 

var type = MyExtensions.GetDataType(tranColumns.InvoiceDate); //Gets System.Type 

List<type> list= new List<type>(); 
} 

     public static string GetEnumDescription(System.Enum value) 
    { 
     FieldInfo fi = value.GetType().GetField(value.ToString()); 
     DescriptionAttribute[] attributes = 
      (DescriptionAttribute[])fi.GetCustomAttributes(typeof(DescriptionAttribute), false); 

     if (attributes != null && attributes.Length > 0) 
      return attributes[0].Description; 
     else 
      return value.ToString(); 
    } 

    public static Type GetDataType(System.Enum value) 
    { 
     switch(GetEnumDescription(value).ToLower()) 
     { 
      case "datetime": 
       return typeof(DateTime); 
      case "string": 
       return typeof(String); 
      case "int": 
       return typeof(Int32); 
      default: 
       Utilities.log("Unkwown datatype",LogType.ErrorEntry); 
       return typeof(Object); 
     } 
    } 

不能創建的 「類型」 這樣的清單!

+0

你的MyExtensions.GetDataType方法是做什麼的? – 2015-03-31 13:01:21

+0

它簡單地讀取該描述中,使用一個開關殼體,並返回的typeof(String)或typeof運算(日期時間)或typeof運算(Int32)已 – Kirtiraj 2015-03-31 13:04:23

+0

你應該提供該代碼。我們不知道它是否無缺陷。你可以,但我們沒有。 – 2015-03-31 13:09:06

回答

1

LINQ到拯救!

  var type = MyExtensions.GetDataType(column as Enum); 

     DataTable dtAscen; //=logic to read table; 
     List<object> listBeforeSort = (from x in dtAscen.AsEnumerable() 
          select (object)Convert.ChangeType(x.Field<string>(column.ToString()), type)).ToList(); 
     var temp = listBeforeSort.OrderBy(s => s); 
     if(!listBeforeSort.SequenceEqual(temp))    
      Utilities.log("Issue with ascending sort on column " + column.ToString(), LogType.ErrorEntry); 
+0

好吧,我還是好奇系統的工作原理完全與這個名單但是,嘿! ,只要這與原始類型一起工作,我很高興.. – Kirtiraj 2015-03-31 14:36:57

5
Type listType = typeof(List<>).MakeGenericType(type); 
IList list= (IList)Activator.CreateInstance(listType); 

您需要使用IList.Add與對象,因爲轉換爲List是不可能的。我重讀你的代碼,似乎你可以編輯,並以這種方式創建列表:

public static List<T> CreateMyList<T>(System.Enum value) 
    { 
     switch(GetEnumDescription(value).ToLower()) 
     { 
      case "datetime": 
       return new List<DateTime>(); 
      case "string": 
       return new List<String>(); 
      case "int": 
       return new List<Int32>(); 
      default: 
       Utilities.log("Unkwown datatype",LogType.ErrorEntry); 
       return new List<Object>(); 
     } 
    } 
+0

如何元素加入到這個名單?它看起來像它接受任何「對象」的類型。我將無法保證數據類型和list.SequenceEquals(anotherList)不會提供 – Kirtiraj 2015-03-31 13:52:57

+0

我編輯我的回答,見上面。 – 2015-03-31 14:09:12

+0

謝謝雷丁,但編譯器抱怨它不能轉換列表列出也隱含地,我找到了解決這個問題的方法! - LINQ營救 – Kirtiraj 2015-03-31 14:32:06

0

您可能需要Activator.CreateInstance方法(Type) https://msdn.microsoft.com/en-us/library/wccyzw83%28v=vs.110%29.aspx

string[] instances = instanceSpec.Split(';'); 
    Array instlist = Array.CreateInstance(typeof(object), instances.Length); 
    object item; 
    for (int i = 0; i < instances.Length; i++) 
    { 
     // create the object from the specification string 
     Console.WriteLine("Creating instance of: {0}", instances[i]); 
     item = Activator.CreateInstance(Type.GetType(instances[i])); 
     instlist.SetValue(item, i); 
    } 
    Console.WriteLine("\nObjects and their default values:\n"); 
    foreach (object o in instlist) 
    { 
     Console.WriteLine("Type:  {0}\nValue: {1}\nHashCode: {2}\n", 
      o.GetType().FullName, o.ToString(), o.GetHashCode()); 
    }