用于每个迭代类属性

时间:2016-11-16 00:18:42

标签: vb.net class for-loop each

我有这个班级

Public Class TExperience
    Public ID As Integer
    Public CompanyName As String
    Public Country As String
    Public Years As Integer
    Public Months As Integer
    Public JobTitle As String
    Public Function Arr() As String()
        Return {"ID", "CompanyName", "Country", "Years", "Months", "JobTitle"}
    End Function
End Class

这就是它的工作原理

Public Function Set()
    Dim D As New TExperience
    D.CompanyName = "Any Data"
    D.Country = "Any Data"
    D.ID = "Any Data"
    D.JobTitle = "Any Data"
    D.Months = "Any Data"
End Function

我需要通过" For Each ....."在课堂上

        D.CompanyName = "Any Data"
        D.Country = "Any Data"
        D.ID = "Any Data"
        D.JobTitle = "Any Data"
        D.Months = "Any Data"

怎么做?

2 个答案:

答案 0 :(得分:0)

是的,如果......这是可能的 注意:您发布了包含公共字段的类,例如Public CompanyName As String。虽然通常使用属性 - Public Property CompanyName As String是个好主意。以下代码适用于类属性,但您可以将PropertyInfo替换为FieldInfo。但是,建议使用属性来公开类值。

如果您正在寻找是/否答案,可以通过for-each设置属性吗?,答案是。但是应该出现更多关于你的问题的问题。 何时,为什么,为...... 等等。

例如,我们遇到一种情况,即特定类型与其他类型具有共同属性,有时甚至从这些类型派生,我们需要转换它们。一种方法是使用“装饰”模式。但这是我们为水化物质所做的工作(免责声明 - 代码是通过转换器从c#转换而来的,我添加了一些像“类型”的东西,我不确定它是100%正确的)

''' Everything "S" - source, "D" - destination. "T" - type
Public Shared Function Hydrate(Of TS, TD)(source As TS, destination As TD) As TD

    Dim sPI() As PropertyInfo = 
        source.[GetType]().GetProperties(BindingFlags.[Public] Or BindingFlags.Instance)
    Dim dPI() As PropertyInfo = 
        destination.[GetType]().GetProperties(BindingFlags.[Public] Or BindingFlags.Instance)

    For Each s As PropertyInfo In sPI
        Dim d As PropertyInfo = 
            dPI.FirstOrDefault(Function(pi) pi.Name = s.Name AndAlso pi.PropertyType = s.PropertyType)
        If d IsNot Nothing Then
            d.SetValue(destination, s.GetValue(source, Nothing), Nothing)
        End If
    Next
    Return destination
End Function

所以,我们走了。在此示例中,迭代属性,当它们的名称和数据类型完全匹配时,将填充它们。但除了类似模型的水合作用外,它的用途是什么?我的意思是,这是JSON被反序列化时内部发生的事情等等。但是在日常编程中你不会做这样的事情。

答案 1 :(得分:-1)

你要求的是不可能的。正如您所知,For Each用于对可枚举列表中的每个项执行相同的操作。对象的属性不是可枚举列表,因此For Each在这种情况下不适用。设置多个属性值的方法就像您现在所做的那样。

也就是说,在刚创建的对象上设置多个属性时,可以使用对象初始化语法,例如

Dim D As New TExperience With
{
    .CompanyName = "Any Data",
    .Country = "Any Data",
    .ID = "Any Data",
    .JobTitle = "Any Data",
    .Months = "Any Data"
}

显然不是你要求的,但你现在正在做的事情仍然有所改善。或者,如果对象需要所有数据,则最好使用适当的参数声明构造函数,这样,调用必须提供数据。你仍然需要在构造函数中单独设置每个属性。