我有这个班级
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"
怎么做?
答案 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"
}
显然不是你要求的,但你现在正在做的事情仍然有所改善。或者,如果对象需要所有数据,则最好使用适当的参数声明构造函数,这样,调用必须提供数据。你仍然需要在构造函数中单独设置每个属性。