Vb.net 使用for each迭代类属性

Vb.net 使用for each迭代类属性,vb.net,class,for-loop,each,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()

我有这门课

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
用于对可枚举列表中的每个项目执行相同的操作。对象的属性不是可枚举列表,因此每个属性的
在这种情况下不适用。设置多个特性值的方法与您现在所做的相同

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

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

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

是的,如果
注意:您发布了带有公共字段的类,例如,
公共公司名称为String
。虽然通常最好使用属性-
公共属性CompanyName作为字符串
。下面的代码用于类属性,但您可以将
PropertyInfo
替换为
FieldInfo
。但是,建议使用属性公开类值。

如果您正在寻找问题的“是/否”答案,“是否可以通过为每个事件设置属性?”答案是“是”。但是关于你的问题应该会有更多的问题。什么时候、为什么、为什么……等等

例如,我们有一种情况,即特定类型与其他类型具有公共属性,有时甚至从这些类型派生,我们需要转换它们。一种方法是使用“装饰器”模式。但下面是我们对水合物属性所做的工作(免责声明-代码是通过转换器从c#转换而来的,我添加了一些类似“as type”的内容,我不确定它是否100%正确)


那么,我们开始吧。在本例中,属性被迭代,当它们的名称和数据类型完全匹配时,就会填充它们。但除了类似模型的水合作用之外,它还有什么用呢?我的意思是,当JSON被反序列化时,内部会发生这种情况,等等。但是在日常编程中,你不会这样做。

每个都是用于迭代集合的,这里不需要。有什么方法可以在这里做,或者有什么方法可以做我需要的事情吗?我根本不清楚你想做什么。要通过一个方法“设置”所有这些成员,我将使用constructori。我想再次将数据设置为所有变量,并使用for eachOnce,for/Each用于迭代集合中的项
TExperience
不是一个集合,我看不出在没有明确问题的情况下,它与任何具体内容有什么关系。为什么要花时间重新表述上面的评论,因为你清楚地表明,这不是他所要求的,而这对你提出的解决方案没有任何价值。国际海事组织要求首先澄清。。。另一方面,使用with进行实例化是很好的,但我们显然不知道它是什么。@Zaggler,我认为很明显,OP将多个属性设置为一个列表,他们想要一种枚举该列表的方法。我认为提供有关如何更好地设置这些属性值的信息是值得的。请注意,此代码在OP类上不起作用,因为该类没有任何属性
GetProperties
不会在OP类上返回任何内容……而且我认为OP希望迭代来自该
Arr
function@ChrisDunaway嘿,显然。。。我在回答这个问题,不管操作码是什么。问题是“…iterate class properties”@puropoix见上文^^^^不要吹毛求疵-这是一个足够有用的答案-但属性是由于您的编辑而添加到问题中的;OP从未提及此事。我认为OP不知道田地和溪流之间的区别
Dim D As New TExperience With
{
    .CompanyName = "Any Data",
    .Country = "Any Data",
    .ID = "Any Data",
    .JobTitle = "Any Data",
    .Months = "Any Data"
}
''' 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