【问题标题】:.net Create a list of objects where the object type is from a string.net 创建对象类型来自字符串的对象列表
【发布时间】:2015-01-08 19:42:18
【问题描述】:

我需要一种创建对象列表的方法,其中对象来自字符串

例如,我希望将以下内容转换为对象列表

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

【问题讨论】:

    标签: vb.net asp.net-mvc-5 json.net dropzone.js csvhelper


    【解决方案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 */ );
    

    不要尝试将对象强制转换为特定的非接口类型 - 您从字符串创建实例,因此您不了解实际类型 - 您只知道它们可能会使用哪些接口 em> 实施。

    【讨论】:

    • 如何使用它来创建对象列表?
    • @adamias 我将添加一个小样本来显示它。你会阅读/翻译 C# 吗? (我的 C# 比我的 VB.Net 好:))
    • 那太好了。是的,我可以将其转换为 vb.net。谢谢
    • @adamias 我添加了一个示例 - 如果您有更多问题,请告诉我。
    猜你喜欢
    • 1970-01-01
    • 2020-07-09
    • 1970-01-01
    • 2018-05-19
    • 1970-01-01
    • 1970-01-01
    • 2013-03-25
    • 1970-01-01
    • 2011-06-23
    相关资源
    最近更新 更多