2012-08-15 4 views
0

다른 속성을 가진 Upload 클래스가 있는데이 클래스 또는 다른 propertys 내부에서 각각의 UploadObject 속성을 찾고 싶습니다. 업로드 클래스에있는 모든 UploadObject를 어떻게 찾을 수 있습니까? 객체에서 사용자 정의 유형 찾기

class UploadObject 
{ 
    public string ID {get; set;} 
    //... 
} 

class PicUpload 
{ 
    UploadObject Pic {get; set;} 
    //... 
} 

class FileUpload 
{ 
    UploadObject File {get; set;} 
    //... 
} 

class Upload 
{ 
    //.. 
    FileUpload File {get; set;} 
    List<PicUpload> Pics {get; set;} 
    //... 
    UploadObject Something {get; set} 
} 

편집

:

public object[] FindProperties(object objectTree, Type targetType) {} 
+0

당신이있는 거 시작점 :

public static T[] GetAllPropertyValuesForTypeinTree<T>(object rootObject) { var propertyInfos = rootObject.GetType().GetProperties(); var withCorrectPropertyType = propertyInfos .Where(p => p.PropertyType == typeof(T)).ToList(); var withListsOfType = propertyInfos.Where(p => IsEnumerableOf<T>(p.PropertyType)).ToList(); var complexProperties = propertyInfos.Except( withCorrectPropertyType.Concat(withListsOfType)) .Where(p => !p.PropertyType.IsPrimitive && !p.PropertyType.IsGenericType); var complexValues = new List<T>(); foreach (var complexProperty in complexProperties) { complexValues.AddRange(GetAllPropertyValuesForTypeinTree<T>( complexProperty.GetValue(rootObject, null))); } var listValues = withListsOfType.Select(p => (IEnumerable)p.GetValue(rootObject, null)) .SelectMany(p => p.OfType<T>()); var propertyValues = withCorrectPropertyType.Select(p => (T) p.GetValue(rootObject, null)); return propertyValues.Concat(listValues).Concat(complexValues).ToArray(); } private static bool IsEnumerableOf<T>(Type type) { if (!typeof (IEnumerable).IsAssignableFrom(type)) return false; return type.GetInterfaces().Any(interfaceType => interfaceType.IsGenericType && (interfaceType.GetGenericTypeDefinition() == typeof(IEnumerable<>) && type.GetGenericArguments()[0] == typeof(T))) || type == typeof(IEnumerable<T>); } 

당신은 그것을 부를 것이다? – rene

+0

@rene 내 질문을 업데이트했습니다 ;-) – jwillmer

+0

'FindProperties' 함수에서 반환 된 배열에는 무엇이 포함됩니까? – PHeiberg

답변

0

는이 같은 뭔가를 찾고있다 : 나는 같은 기능을 찾고 있어요? 반환 형식이 UploadClass 또는 상속 클래스입니다

typeof(UploadClass).GetProperties().Where(x => x.PropertyType == typeof(UploadObject)); 
+0

@ Florlan07'Where (x => x.PropertyType == typeof (UploadObject)); ' – Willem

+0

@Willem 사실, 고맙습니다. – oopbase

2
typeof(Upload).GetProperties() 
    .Where(p => typeof(UploadObject).IsAssignableFrom(p.PropertyType)); 

모든 속성을 반환합니다. 그런 다음 UploadObject를 포함 할 수없는 유형에 대한 중지 조건과 함께 재귀를 사용해야합니다. 중지 조건은 반환 유형이 IsPrimitive (Type에서 사용 가능)을 사용하는 원시 유형인지 확인하는 것일 수 있습니다.

해당 유형을 원한다면 IsAssignableFrom을 == typeof(UploadObject)으로 바꿀 수 있습니다.

편집 :

이 내가 생각했던 생각을합니다. 면책 조항 : 내가 수행 한 유일한 테스트는 컴파일 한 다음 시나리오 하나에 대해 실행하는 것입니다.이 시나리오는 효과가 있지만 아이디어를 보여줍니다. 클래스의 인스턴스가 업로드되어

var propVals = GetAllPropertyValuesForTypeinTree<UploadObject>(theInstance);