2015-03-31 6 views
0

Я выполняю автоматизации с помощью C# в качестве языка программированияСписок типа, который определяется во время выполнения

У меня есть Enum проведение столбцов в таблице. Я сохраняю тип данных этих столбцов в «Описание» для каждого имени столбца.

Каждый из столбцов сортируется после сортировки. Я хочу проверить сортировку по определенному столбцу правильно. Я делаю список данных в столбце, сортируя его программно, а затем сортируя его на экране, читая содержимое, а затем используя List.SequenceEquals

Я пытаюсь создать список «type» (как указано в "Описание"). Но похоже, что я не могу создать список объектов времени исполнения.

Любое решение этого вопроса?

КОД

{ 
    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? –

+0

Он просто читает описание, использует случай переключения и возвращает typeof (String) или typeof (DateTime) или typeof (Int32) – Kirtiraj

+0

Вы должны указать этот код. Мы не знаем, если это ошибка. Вы можете, но мы этого не сделаем. –

ответ

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

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

Вам нужно использовать IList.Add с объектом, потому что приведение в список невозможно. Я перечитал вам код, и кажется, что вы можете изменить его и создать список таким образом:

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

Как добавить элементы в этот список? Похоже, что он принимает любой тип «объекта». Я не буду в состоянии гарантировать тип данных и список. Невозможно быть доступным. SequenceEquals (anotherList) – Kirtiraj

+0

Я отредактировал свой ответ, см. Выше. –

+0

Спасибо Radin, но он компилятор жалуется, что он не может конвертировать List в список неявно. Также я нашел способ справиться с этой проблемой - LINQ to Rescue! – Kirtiraj

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()); 
    } 
Смежные вопросы