programing

c # foreach (개체의 속성)…이 작업을 수행하는 간단한 방법이 있습니까?

nasanasas 2020. 10. 9. 11:16
반응형

c # foreach (개체의 속성)…이 작업을 수행하는 간단한 방법이 있습니까?


여러 속성을 포함하는 클래스가 있습니다 (차이가 있으면 모두 문자열입니다).
또한 클래스의 여러 인스턴스가 포함 된 목록이 있습니다.

클래스에 대한 단위 테스트를 만드는 동안 목록의 각 개체를 반복 한 다음 해당 개체의 각 속성을 반복하기로 결정했습니다.

이렇게하는 것이 간단하다고 생각했는데 ...

foreach (Object obj in theList)
{
     foreach (Property theProperties in obj)
     {
         do some stufff!!;
     }
}

그러나 이것은 작동하지 않았습니다! :(이 오류가 발생합니다 ...

" 'Application.Object'에 'GetEnumerator'에 대한 공용 정의가 포함되어 있지 않기 때문에 foreach 문은 'Application.Object'유형의 변수에서 작동 할 수 없습니다."

많은 ifs 및 루프없이 또는 너무 복잡한 작업을 수행하지 않고이를 수행하는 방법을 아는 사람이 있습니까?


이것을 시도하십시오 :

foreach (PropertyInfo propertyInfo in obj.GetType().GetProperties())
{
   // do stuff here
}

또한 Type.GetProperties()바인딩 플래그 집합을 허용하는 오버로드가 있으므로 접근성 수준과 같은 다른 기준으로 속성을 필터링 할 수 있습니다. 자세한 내용은 MSDN을 참조하십시오. Type.GetProperties 메서드 (BindingFlags) 마지막으로 잊지 마세요. "system.Reflection"어셈블리 참조를 추가하십시오.

예를 들어 모든 공용 속성을 해결하려면 :

foreach (var propertyInfo in obj.GetType()
                                .GetProperties(
                                        BindingFlags.Public 
                                        | BindingFlags.Instance))
{
   // do stuff here
}

이것이 예상대로 작동하는지 알려주십시오.


다음과 같이 객체의 색인화되지 않은 모든 속성을 반복 할 수 있습니다.

var s = new MyObject();
foreach (var p in s.GetType().GetProperties().Where(p => !p.GetGetMethod().GetParameters().Any())) {
    Console.WriteLine(p.GetValue(s, null));
}

단순 속성뿐만 아니라 인덱서GetProperties()반환 하므로 두 번째 매개 변수 로 전달하는 것이 안전하다는 것을 알기 위해 호출 하기 전에 추가 필터가 필요합니다 .GetValuenull

쓰기 전용 및 기타 액세스 할 수없는 속성을 제거하려면 필터를 추가로 수정해야 할 수 있습니다.


거의 완료되었습니다. 컬렉션이나 속성 모음의 형태로 속성에 액세스 할 수있을 것으로 기대하는 대신 유형에서 속성을 가져 오면됩니다.

var property in obj.GetType().GetProperties()

거기에서 다음과 같이 액세스 할 수 있습니다 .

property.Name
property.GetValue(obj, null)

GetValue문자열을 문자의 집합이기 때문에, 당신은 또한 요구가있을 경우 문자를 반환하는 인덱스를 지정할 수 있습니다 - 두 번째 매개 변수는 속성 컬렉션을 반환 작동합니다 인덱스 값을 지정할 수 있습니다.


물론입니다. 문제 없습니다.

foreach(object item in sequence)
{
    if (item == null) continue;
    foreach(PropertyInfo property in item.GetType().GetProperties())
    {
        // do something with the property
    }
}

이를 위해 Reflection을 사용하십시오.

SomeClass A = SomeClass(...)
PropertyInfo[] properties = A.GetType().GetProperties();

A small word of caution, if "do some stuff" means updating the value of the actual property that you visit AND if there is a struct type property along the path from root object to the visited property, the change you made on the property will not be reflected on the root object.


I couldn't get any of the above ways to work, but this worked. The username and password for DirectoryEntry are optional.

   private List<string> getAnyDirectoryEntryPropertyValue(string userPrincipalName, string propertyToSearchFor)
    {
        List<string> returnValue = new List<string>();
        try
        {
            int index = userPrincipalName.IndexOf("@");
            string originatingServer = userPrincipalName.Remove(0, index + 1);
            string path = "LDAP://" + originatingServer; //+ @"/" + distinguishedName;
            DirectoryEntry objRootDSE = new DirectoryEntry(path, PSUsername, PSPassword);
            var objSearcher = new System.DirectoryServices.DirectorySearcher(objRootDSE);
            objSearcher.Filter = string.Format("(&(UserPrincipalName={0}))", userPrincipalName);
            SearchResultCollection properties = objSearcher.FindAll();

            ResultPropertyValueCollection resPropertyCollection = properties[0].Properties[propertyToSearchFor];
            foreach (string resProperty in resPropertyCollection)
            {
                returnValue.Add(resProperty);
            }
        }
        catch (Exception ex)
        {
            returnValue.Add(ex.Message);
            throw;
        }

        return returnValue;
    }

참고URL : https://stackoverflow.com/questions/9893028/c-sharp-foreach-property-in-object-is-there-a-simple-way-of-doing-this

반응형