.net 创建对象列表,其中对象类型来自字符串
.net Create a list of objects where the object type is from a string
我需要一种创建对象列表的方法,其中对象来自字符串
例如,我希望将以下内容转换为对象列表
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 上传文件以及 table 名称、对象 class 名称和映射 class 名称来实现。这现在允许我使用 csvhelper 解析文件的内容,准备导入到临时 table.
<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
您可以使用 Activator.CreateInstance
根据字符串程序集名称/类型名称创建对象。 (该方法还有许多其他重载。)
调用 returns 和 Object
,因此您必须将其转换为已知类型(例如,接口类型)。据我所知(我不是 VB.Net 专家)无法用字符串类型名称定义变量,因此您需要
- 将您的实例存储在
Object
-s 的列表中(这可行,但您实际上并没有这样使用的对象)。
- 让你的类型都实现常见的、众所周知的接口。在这种情况下,您可以使用
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 */ );
不要尝试将对象转换为特定的非接口类型 - 您从字符串创建实例,因此您不了解实际类型 - 您只知道它们是什么接口 可能实施。
我需要一种创建对象列表的方法,其中对象来自字符串
例如,我希望将以下内容转换为对象列表
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 上传文件以及 table 名称、对象 class 名称和映射 class 名称来实现。这现在允许我使用 csvhelper 解析文件的内容,准备导入到临时 table.
<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
您可以使用 Activator.CreateInstance
根据字符串程序集名称/类型名称创建对象。 (该方法还有许多其他重载。)
调用 returns 和 Object
,因此您必须将其转换为已知类型(例如,接口类型)。据我所知(我不是 VB.Net 专家)无法用字符串类型名称定义变量,因此您需要
- 将您的实例存储在
Object
-s 的列表中(这可行,但您实际上并没有这样使用的对象)。 - 让你的类型都实现常见的、众所周知的接口。在这种情况下,您可以使用
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 */ );
不要尝试将对象转换为特定的非接口类型 - 您从字符串创建实例,因此您不了解实际类型 - 您只知道它们是什么接口 可能实施。