클래스의 모든 속성을 루프하려면 어떻게 해야 합니까?
수업이 있어요.
Public Class Foo
Private _Name As String
Public Property Name() As String
Get
Return _Name
End Get
Set(ByVal value As String)
_Name = value
End Set
End Property
Private _Age As String
Public Property Age() As String
Get
Return _Age
End Get
Set(ByVal value As String)
_Age = value
End Set
End Property
Private _ContactNumber As String
Public Property ContactNumber() As String
Get
Return _ContactNumber
End Get
Set(ByVal value As String)
_ContactNumber = value
End Set
End Property
End Class
위 클래스의 속성을 루프하고 싶습니다.예:
Public Sub DisplayAll(ByVal Someobject As Foo)
For Each _Property As something In Someobject.Properties
Console.WriteLine(_Property.Name & "=" & _Property.value)
Next
End Sub
리플렉션 사용
Type type = obj.GetType();
PropertyInfo[] properties = type.GetProperties();
foreach (PropertyInfo property in properties)
{
Console.WriteLine("Name: " + property.Name + ", Value: " + property.GetValue(obj, null));
}
Excel - "시스템"이 없기 때문에 BindingFlags에 액세스하기 위해 추가해야 하는 도구/참조 항목.목록 내 반영" 항목
편집: BindingFlags 값을 지정할 수도 있습니다.type.GetProperties()
:
BindingFlags flags = BindingFlags.Public | BindingFlags.Instance;
PropertyInfo[] properties = type.GetProperties(flags);
그러면 반환된 속성이 퍼블릭인스턴스 속성(고정 속성, 보호된 속성 제외)으로 제한됩니다.
지정할 필요가 없습니다.BindingFlags.GetProperty
전화할 때 사용합니다.type.InvokeMember()
부동산의 가치를 얻기 위해서요.
이 오브젝트에 커스텀프로퍼티 모델이 있는 경우)DataRowView
에 대해서DataTable
)을(를)사용해야합니다.TypeDescriptor
좋은 소식은 이것이 정규 수업에서도 여전히 잘 작동한다는 것입니다(또한 리플렉션보다 훨씬 빠를 수도 있습니다).
foreach(PropertyDescriptor prop in TypeDescriptor.GetProperties(obj)) {
Console.WriteLine("{0} = {1}", prop.Name, prop.GetValue(obj));
}
또, 다음과 같은 것에 간단하게 액세스 할 수 있습니다.TypeConverter
포맷:
string fmt = prop.Converter.ConvertToString(prop.GetValue(obj));
Brannon이 제공하는 C#의 VB 버전:
Public Sub DisplayAll(ByVal Someobject As Foo)
Dim _type As Type = Someobject.GetType()
Dim properties() As PropertyInfo = _type.GetProperties() 'line 3
For Each _property As PropertyInfo In properties
Console.WriteLine("Name: " + _property.Name + ", Value: " + _property.GetValue(Someobject, Nothing))
Next
End Sub
행 번호 3이 아닌에서의 바인딩 플래그 사용
Dim flags As BindingFlags = BindingFlags.Public Or BindingFlags.Instance
Dim properties() As PropertyInfo = _type.GetProperties(flags)
반사가 꽤 '무겁다'
다음 솔루션을 사용해 보십시오.
C#
if (item is IEnumerable) {
foreach (object o in item as IEnumerable) {
//do function
}
} else {
foreach (System.Reflection.PropertyInfo p in obj.GetType().GetProperties()) {
if (p.CanRead) {
Console.WriteLine("{0}: {1}", p.Name, p.GetValue(obj, null)); //possible function
}
}
}
VB.Net
If TypeOf item Is IEnumerable Then
For Each o As Object In TryCast(item, IEnumerable)
'Do Function
Next
Else
For Each p As System.Reflection.PropertyInfo In obj.GetType().GetProperties()
If p.CanRead Then
Console.WriteLine("{0}: {1}", p.Name, p.GetValue(obj, Nothing)) 'possible function
End If
Next
End If
리플렉션으로 인해 메서드 호출의 +/- 1000배 속도가 느려집니다('일상 사물의 퍼포먼스' 참조).
LINQ lamda를 사용한 다른 방법은 다음과 같습니다.
C#:
SomeObject.GetType().GetProperties().ToList().ForEach(x => Console.WriteLine($"{x.Name} = {x.GetValue(SomeObject, null)}"));
VB.NET:
SomeObject.GetType.GetProperties.ToList.ForEach(Sub(x) Console.WriteLine($"{x.Name} = {x.GetValue(SomeObject, Nothing)}"))
이렇게 하는 거예요.
foreach (var fi in typeof(CustomRoles).GetFields())
{
var propertyName = fi.Name;
}
private void ResetAllProperties()
{
Type type = this.GetType();
PropertyInfo[] properties = (from c in type.GetProperties()
where c.Name.StartsWith("Doc")
select c).ToArray();
foreach (PropertyInfo item in properties)
{
if (item.PropertyType.FullName == "System.String")
item.SetValue(this, "", null);
}
}
위의 코드 블록을 사용하여 이름이 "Doc"으로 시작하는 웹 사용자 제어 개체의 모든 문자열 속성을 재설정했습니다.
이 예에서는 커스텀 파일(ini와 xml의 혼합)의 데이터를 시리얼화하고 있습니다.
' **Example of class test :**
Imports System.Reflection
Imports System.Text
Public Class Player
Property Name As String
Property Strong As Double
Property Life As Integer
Property Mana As Integer
Property PlayerItems As List(Of PlayerItem)
Sub New()
Me.PlayerItems = New List(Of PlayerItem)
End Sub
Class PlayerItem
Property Name As String
Property ItemType As String
Property ItemValue As Integer
Sub New(name As String, itemtype As String, itemvalue As Integer)
Me.Name = name
Me.ItemType = itemtype
Me.ItemValue = itemvalue
End Sub
End Class
End Class
' **Loop function of properties**
Sub ImportClass(varobject As Object)
Dim MaVarGeneric As Object = varobject
Dim MaVarType As Type = MaVarGeneric.GetType
Dim MaVarProps As PropertyInfo() = MaVarType.GetProperties(BindingFlags.Public Or BindingFlags.Instance)
Console.Write("Extract " & MaVarProps.Count & " propertie(s) from ")
If MaVarType.DeclaringType IsNot Nothing Then
Console.WriteLine(MaVarType.DeclaringType.ToString & "." & MaVarType.Name)
Else
Console.WriteLine(MaVarType.Namespace & "." & MaVarType.Name)
End If
For Each prop As PropertyInfo In MaVarProps
If prop.CanRead = True Then
If prop.GetIndexParameters().Length = 0 Then
Dim MaVarValue As Object = prop.GetValue(MaVarGeneric)
Dim MaVarValueType As Type = MaVarValue.GetType
If MaVarValueType.Name.Contains("List") = True Then
Dim MaVarArguments As New StringBuilder
For Each GenericParamType As Type In prop.PropertyType.GenericTypeArguments
If MaVarArguments.Length = 0 Then
MaVarArguments.Append(GenericParamType.Name)
Else
MaVarArguments.Append(", " & GenericParamType.Name)
End If
Next
Console.WriteLine("Sub-Extract: " & prop.MemberType.ToString & " " & prop.Name & " As List(Of " & MaVarArguments.ToString & ")")
Dim idxItem As Integer = 0
For Each ListItem As Object In MaVarValue
Call ImportClass(MaVarValue(idxItem))
idxItem += 1
Next
Continue For
Else
Console.WriteLine(prop.MemberType.ToString & " " & prop.Name & " As " & MaVarValueType.Name & " = " & prop.GetValue(varobject))
End If
End If
End If
Next
End Sub
' **To test it :**
Dim newplayer As New Player With {
.Name = "Clark Kent",
.Strong = 5.5,
.Life = 100,
.Mana = 50
}
' Grab a chest
newplayer.PlayerItems.Add(New Player.PlayerItem("Chest", "Gold", 5000))
' Grab a potion
newplayer.PlayerItems.Add(New Player.PlayerItem("Potion", "Life", 50))
' Extraction & Console output
Call ImportClass(newplayer)
콘솔 미리보기: 클래스의 속성 루프 결과
언급URL : https://stackoverflow.com/questions/531384/how-to-loop-through-all-the-properties-of-a-class
'programing' 카테고리의 다른 글
Microsoft SQL Server 2005에서 group_concat MySQL 함수를 시뮬레이션하고 있습니까? (0) | 2023.04.07 |
---|---|
SQL Server 2005에서 1개의 스테이트먼트에 2개의 테이블을 갱신하려면 어떻게 해야 합니다. (0) | 2023.04.07 |
SQL Server VARCHAR/NVARCHAR 문자열에 줄 바꿈을 삽입하는 방법 (0) | 2023.04.07 |
SQL Server 2008에서 테이블 에일리어스를 사용하여 UPDATE SQL을 작성하는 방법 (0) | 2023.04.07 |
여러 열에 걸쳐 DISTINCT 카운트 (0) | 2023.04.07 |