2015-01-08 1 views
2

Мне нужен способ создания списка объектов, где объект из строки.net Создать список объектов, тип объекта из строки

, например, я хочу ниже, чтобы быть преобразован в список объектов

Dim categoryList as IList(Of "classname") = new List(Of "class name") 

конечный результат

Dim categoryList As IList(Of BO.Store.Category) = New List(Of BO.Store.Category) 

Благодаря xxbbcc указал мне в правильном направлении. Я придумал решение ниже, которое позволяет загружать любой файл csv и анализировать его в список объектов x.

Это работает, загружая файл с помощью dropzone вместе с именем таблицы, именем класса объекта и именем класса сопоставления. Теперь это позволяет мне анализировать содержимое файла, используя csvhelper, готовый для импорта в временную таблицу.

<AcceptVerbs(HttpVerbs.Post), BaseViewModelFilter> 
    Function Upload(model As ImportUploadViewModel) As JsonResult 

     Dim balUpload As BAL.Upload = New BAL.Upload() 
     Dim balImport As BAL.Import = New BAL.Import() 
     Dim folder As String = String.Format("{0}tmp\import\category", Server.MapPath("\")) 

     Dim result = balUpload.SaveFiles(Request, folder, UserProfile.ID) 

     Dim importClassType = Type.[GetType](String.Format("Roxybox.BO.{0}", model.EntityClass)) 
     Dim importClassMapType = Type.[GetType](String.Format("Roxybox.BO.{0}", model.EntityMap)) 

     Dim records As IList 

     ' Import all successful files 
     For Each successFile As String In result("success") 

      ' Parse csv file 
      Using sr = New StreamReader(String.Format("{0}\{1}", folder, successFile)) 
       Dim reader = New CsvReader(sr) 

       reader.Configuration.RegisterClassMap(importClassMapType) 
       records = reader.GetRecords(importClassType).ToList() 

      End Using 

      For Each category In records 
       Dim data As BO.Import = New BO.Import() 
       With data 
        .EntityModel = model.EntityModel 
        .Data = JsonConvert.SerializeObject(category) 
        .UserProfileID = UserProfile.ID 
        .Filename = successFile 
        .Status = "pending" 
       End With 

       balImport.Save(data, UserProfile.ID) 
      Next 
     Next 

     Return Json(result, JsonRequestBehavior.AllowGet) 

    End Function 

ответ

1

Вы можете использовать Activator.CreateInstance для создания объектов на основе имени строки имени сборки/типа. (Метод также имеет много других перегрузок.)

Вызов возвращает Object, поэтому вам нужно будет передать его известному типу (например, тип интерфейса). Насколько я знаю (я не эксперт VB.Net) нет никакого способа определить переменную с именем типа строки, так что вы должны будете либо

  1. магазин экземпляры в списке Object -s (это работает, но у вас на самом деле нет подходящих объектов).
  2. Имейте все типы, которые реализуют общие, хорошо известные интерфейсы. В этом случае вы можете создавать экземпляры ваших типов, используя CreateInstance, а затем передавать их известному типу интерфейса. Имя типа будет исходить из строки, но тип интерфейса должен быть жестко закодирован в код.

Например (в C#):

List<IMyInterface> oList = new List<IMyInterface>(); 

    // ... 

    // Loop through your assembly/type names 
    ObjectHandle oHandle = Activator.CreateInstance(sAssemblyName, sTypeName); 
    IMyInterface oInstance = oHandle.Unwrap() as IMyInterface; // null if wrong type 

    if (oInstance!=null) 
     oList.Add(oInstance); 

    // ... 

    // When you try using these instances, you can pull them from 
    // the list and call functions through IMyInterface 
    oList(3).CallInterfaceMember(/* params */); 

Не пытайтесь бросить объекты к определенному типу без интерфейса - создавать экземпляры из строк, так что вы не имеете фактических знаний реального типа - вы знаете только, какие интерфейсы они могут реализовать.

+0

Как использовать его для создания списка объектов? – adamias

+0

@adamias Я добавлю небольшой образец, который показывает его. Можете ли вы читать/переводить C#? (Мой C# лучше, чем мой VB.Net :)) – xxbbcc

+0

Посмотрите http://msdn.microsoft.com/en-us/library/d133hta4(v=vs.110).aspx –

 Смежные вопросы

  • Нет связанных вопросов^_^