.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}tmpimportcategory", 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
可以使用

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 */ );

不要尝试将对象强制转换为特定的非接口类型 - 从字符串创建实例,因此您没有实际类型的实际知识 - 您只知道它们可能实现哪些接口。

相关内容

  • 没有找到相关文章

最新更新