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()
반환 하므로 두 번째 매개 변수 로 전달하는 것이 안전하다는 것을 알기 위해 호출 하기 전에 추가 필터가 필요합니다 .GetValue
null
쓰기 전용 및 기타 액세스 할 수없는 속성을 제거하려면 필터를 추가로 수정해야 할 수 있습니다.
거의 완료되었습니다. 컬렉션이나 속성 모음의 형태로 속성에 액세스 할 수있을 것으로 기대하는 대신 유형에서 속성을 가져 오면됩니다.
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;
}
'programing' 카테고리의 다른 글
사전을 직렬화 할 때 대 / 소문자 유지 (0) | 2020.10.09 |
---|---|
PHP CURL에서 POST에서 GET으로 전환하는 방법 (0) | 2020.10.09 |
Sails.js 대 Meteor-둘 다의 장점은 무엇입니까? (0) | 2020.10.09 |
Android 스튜디오의 문서보기가 자동으로 열립니다. (0) | 2020.10.09 |
키 스키마의 속성 수는 속성 정의에 정의 된 속성 수와 일치해야합니다. (0) | 2020.10.09 |