我如何使用(反射?)来制作可重用的代码,用于使用xml数据填充对象

时间:2014-10-24 21:37:17

标签: vb.net linq reflection

我正在使用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”)...>

DataMap对象(此示例再次简短而又甜蜜)

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”)...>

标准”CSV布局

“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>

非标准01 ”CSV布局

“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

0 个答案:

没有答案