2014-12-19 4 views
5

나는 컬렉션에 대한 사용자 정의 ExpandableObjectConverter 정의 :속성 그리드 확장의 일반적인 구현을 위해 모든 목록 <T>에 유형 설명자를 추가 하시겠습니까?

public static class ExpandableObjectManager 
{ 
    public static void AddTypeDescriptor(Type tItem) 
    { 
     //eventually calls TypeDescriptor.AddAttributes 
    } 
} 

:이 방법을 사용

TypeDescriptor.AddAttributes(type, 
    new TypeConverterAttribute(typeof(ExpandableCollectionConverter))); 

:

internal class ExpandableCollectionConverter : ExpandableObjectConverter 
{ 
    public override PropertyDescriptorCollection GetProperties(
     ITypeDescriptorContext context, object value, Attribute[] attributes) 
    { 
     //implementation that returns a list of property descriptors, 
     //one for each item in "value" 
    } 
} 

을 또한이 본질적으로이 작업을 수행 ExpandableObjectManager라는 프록시 클래스, 모든 generic List<T>이 prope에서 확장 가능하도록 형식 설명자를 추가 할 수 있습니까? 그리드 그리드? 예를 들어, 간단한 Employee 클래스 제공 :

class Employee 
{ 
    public string Name { get; set; } 
    public string Title { get; set; } 
    public DateTime DateOfBirth { get; set; } 
} 

내가이 작업을 수행 할 수 있습니다 (그리고 그것은,하지만 List<Employee> 작동) :

ExpandableObjectManager.AddTypeDescriptor(typeof(List<Employee>)); 

내가 모든 T 아니라 Employee을 포함하고 싶습니다, 가능한 각 클래스에 대해 1 행을 쓰지 않아도됩니다. 나는이 시도 - 작동하지 않았다 :

ExpandableObjectManager.AddTypeDescriptor(typeof(List<>)); 

TL; DR :

enter image description here

예상 결과 : 속성 그리드에 SelectedObject로 설정 목록의 기본보기 :

enter image description here

List<Employee>에 대한 유형 설명자를 추가하지 않고 모든 List<T>에 대한 일반 처리기를 사용하지 않아도됩니다.

답변

2

편집 : 세 번째 가능성을 추가했습니다.

가 인터페이스 제네릭 형식 구현에 TypeConverterAttribute를 추가

나는이 중 하나가 여기에 세 가지 가능성 멋진 솔루션을하지만 생각하지 않습니다. 단점은 목표로하는 유형을 정확히 맞추지 못할 수도 있지만, 원하는 유형에 좀 더 집중하기 때문에 옵션 2보다 낫습니다.

TypeDescriptor.AddAttributes(typeof(IList), new 
    TypeConverterAttribute(typeof(ExpandableCollectionConverter))); 

TypeConverterAttribute를 object 유형에 추가하십시오. 단점은이 형식 변환기가 프로젝트의 모든 형식에 대한 형식 변환기가 될 것입니다.

TypeDescriptor.AddAttributes(typeof(object), new 
    TypeConverterAttribute(typeof(ExpandableCollectionConverter))); 

는 답장을 보내

public class CustomList<T> : List<T> 
{ 
    static CustomList() 
    { 
     TypeDescriptor.AddAttributes(typeof(CustomList<T>), new TypeConverterAttribute(typeof(ExpandableCollectionConverter))); 
    } 
} 
+0

감사를 List<>에서 상속하고 정적 생성자에 자신을 등록 한 자신의 목록 유형을 만듭니다. 불행히도, # 1 일부 개체는 이미 확장 가능한 개체 변환기의 좋은 구현을 가지고 있기 때문에 어느 옵션도 나를 위해 작동하지 않습니다. 예를 들어 열거 형입니다.# 2 List 을 나타내는 사용자 정의 클래스를 만들고 싶지 않습니다. 그것은 프로그램에 불필요한 복잡성을 추가합니다. 또한 기존 어셈블리에서는 사용할 수 없습니다. – Neolisk

+1

완전히 이해할 수 있습니다. 더 나은 옵션을 찾으면 공유 할 것입니다. – Grax

+0

세 번째 옵션을 추가했습니다. 나는 그것이 가장 실용적으로 보이기 때문에 먼저 그것을 열거했다. – Grax