programing

클래스의 모든 속성을 루프하려면 어떻게 해야 합니까?

bestprogram 2023. 4. 7. 22:02

클래스의 모든 속성을 루프하려면 어떻게 해야 합니까?

수업이 있어요.

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