2014-12-01 3 views
0

아래 표시된 내 코드는 양식의 모든 시각적 및 비 시각적 구성 요소 (OpenDialogs, SaveDialogs 등)를 보여줍니다. 모든 폼 요소를 아는 것보다 구성 요소 이름 (컨트롤 없음)을 지정할 수 있으면 좋을 것 같습니다.목록 구성 요소 (컨트롤이 아님)

private IEnumerable <Component> EnumerateComponents() 
{ 
    return this.GetType() GetFields (BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic) 
    .Where (F => typeof (Component) .IsAssignableFrom (f.FieldType)) 
    .Where (F => typeof (Control) .IsAssignableFrom (f.FieldType)) 
    //.Where componentName.thatIinformed == "OpenDialog1" <<<<<====== 
    .Select (F => f.GetValue (this)) 
    .OfType <Component>(); 
} 

가능합니까?

public IEnumerable<Component> EnumerateComponents() 
{ 
    return this.GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public) 
     .Where(x => typeof(Component).IsAssignableFrom(x.PropertyType)) 
     .Select(x => x.GetValue(this)).Cast<Component>(); 
} 

나는 다음과 같은 사용자 정의 UserControl와 함께이 시도 :

public sealed class MyCustomControl : UserControl 
{ 
    // Adding some Controls for testing 
    public Label MyLabel1 { get; set; } 
    public Label MyLabel2 { get; set; } 

    // Adding a Component (not a Control) for testing 
    public System.Windows.Forms.Timer MyTimer1 { get; set; } 

    public IEnumerable<Component> EnumerateComponents() 
    { 
     return this.GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public) 
      .Where(x => typeof(Component).IsAssignableFrom(x.PropertyType)) 
      .Select(x => x.GetValue(this)).Cast<Component>(); 
    } 

    public IEnumerable<PropertyInfo> EnumerateProperties() 
    { 

     return this.GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public) 
      .Where(x => typeof(Component).IsAssignableFrom(x.PropertyType)); 
    } 
} 

EnumerateProperties 방법은 너무 나는 그것을 테스트 할 수 있었다이의 라인을 따라 뭔가 더 원하는처럼

+0

'Control'은'Component'에서 상속되기 때문에 두 번째 where 절은 필요 없습니다. 사실'Component' 레벨 대신'Control'에서 파생 된'Control' 타입과 타입으로 제한됩니다 . 또한, 그것은 당신이 성취하고자하는 것을 완전히 명확하게하지 않습니다. – Anthony

+0

@Anthony, 답변 해 주셔서 감사합니다. 구성 요소 이름을 말할 때 다른 구성 요소의 속성 만 잡을 수 있습니다 (PropertyInfo [] = component.GetProperties PropertyInfo()). – Luana

답변

1

같습니다 내가 원했던 특성을 찾아 냈다. 여기에는 내가 포함시킨 Timer 속성 (Control이 아니기 때문에 Component이기 때문에 추가 한 속성이 2 Label입니다)이 포함되어 있습니다. 또한 ActiveControl, ParentForm, ContextMenu, ContextMenuStrip, ParentTopLevelControl 기준을 충족하는 UserControl에서 상속받은 6 개의 다른 속성을 선택했습니다.

이제 각각의 값을 가져 오는 것이 null 값을 많이 반환하므로 null이 아닌 값을 필터링해야 할 수도 있습니다. Cast 대신 OfType을 사용하면 Null 값을 제거하는 부작용이 있습니다.

+0

안토니, 다시 한번 감사드립니다. 구성 요소 이름을 검색하기위한 매개 변수를 포함 할 수 있습니까? – Luana

+0

[''Component'] (http://msdn.microsoft.com/en-us/library/system.componentmodel.component.aspx)에는 Name 속성이 없으며 ['Control'] (http : //msdn.microsoft.com/ko-kr/library/system.windows.forms.control.name.aspx) (영문)를 참조하십시오. 'Control' 인 경우'Control'의 이름을 확인하고 싶습니까? 아니면 형식 이름을 기준으로 필터링을 수행하겠습니까? – Anthony

+0

설명이 도움이되었습니다. Anthony, 다시 한번 고마워. – Luana

관련 문제