我正在使用VB.NET 2013,并且我正在尝试编写一个将导入(来自csv文件)客户联系信息的应用程序(例如:CustomerName,ContactLast,ContactFirst,ContactPhn,ContactEmail)。将要有多个csv布局必须处理,所以我使用XML文件来存储各种映射。
我想将DataMaps.xlm中定义的映射加载到DataMap对象中,然后将这些DataMap对象插入到列表框中。在将它们加载到列表框之前,我想让它们填充XML值。我不认为会有超过10 - 15个定义的地图,所以立即加载它们不应该是内存或速度的问题(因为它将是本地运行的应用程序与本地存储的xml数据)
到目前为止我所拥有的内容:
Private mCompany as String
Private mLastName as String
Private mFirstName as String
Private mPhone as String
Private mEmail As String
< ...支持获取/设置项目(属性与私有变量相同;减去前导“m”)...>
Private mDataMapName as String
private mCompany_Col as Integer
private mLastName_Col as Integer
private mFirstName_Col as Integer
private mPhone_Col As Integer
private mEmail_Col As String
< ...支持获取/设置项目(属性与私有变量相同;减去前导“m”)...>
“ABC公司”,“琼斯”,“六月”,“515-874-0098”,“JJ@ABC.COM”
“公司EFG”,“威廉姆斯”,“艾伦”,“515-874-2887”,“alan @efg.com”
此布局的DataMap将是:
<Map>
<DataMapName>Standard</DataMapName>
<Company>1</Company>
<LastName>2</LastName>
<FirstName>3</FirstName>
<Phone>4</Phone>
<Email>5</Email>
</Map>
“Jones”,“June”,“ABC公司”,“515-874-0098”,“JJ@ABC.COM”
“Williams”,“Alan”“公司EFG”,“515-874-2887”,“alan @efg.com”
此格式的DataMap将是:
<Map>
<DataMapName>Not Standard 01</DataMapName>
<Company>3</Company>
<LastName>1</LastName>
<FirstName>2</FirstName>
<Phone>4</Phone>
<Email>5</Email>
</Map>
我只是再次使用VB.NET并且不习惯确定从.xml文件读取数据时使用的“最佳”技术(我可以使用当前LINQ检索s列表)并填充我的DataMap宾语。我知道我可以通过使用每个单独的属性来设置值;但我想编写通用(循环)代码,因为这个应用程序可能会被DataMap要求的更改重写,并在其他应用程序实例中使用它。
目前,我可以创建一个新元素并将其添加到DataMaps.xml文件中。然后我可以正确阅读这些更改。
我遇到的问题是编写'通用'populateMap(mapName As String)函数。我现在在哪里,我可以获取地图(作为XElement的枚举),然后单独查看每个属性并将其存储到DataMap对象的新实例中:
Dim dm as New DataMap
dm.DataMapName = map.Element("DataMapName").Value
dm.Company_Col = map.Element("Company_Col").value
dm.LastName_Col = map.Element("LastName_Col").value
dm.FirstName_Col = map.Element("FirstName_Col").value
...
但是,我想知道是否可以创建类似的东西:(伪代码)
Dim dm As new DataMap
Dim myInstance As New DataMap
Dim myFields As FieldInfo()
Dim myType As Type = GetType(DataMap)
try
myFields = myType.GetFields(BindingFlags.NonPublic)
for each element in map.Elements
Dim f as FieldInfo = GETType(DataMap).GetField(field.name)
dm.(some sort of reference to a FieldInfo() column name, or something) = element.f
(this would look like: dm.Company_Col = element.Company_Col (or a variable referencing the private value "mCompany_Col")
next
catch ...
Finally ...
End Try