2014-06-10 5 views
2

일반 인터페이스가 있고 구현 된 데이터 유형 목록을 갖고 싶습니다. 다음 코드를 사용하면 어떤 형식도 반환되지 않습니다. 내가 돈을 여기에 잘못된 일을 왜하고 무엇구현 된 유형의 일반 인터페이스 가져 오기

:

public class DecimalConverter : IDataTypeConverter, IDataTypeConverter<decimal> 
    { 
    ... 
    } 

인터페이스는 자아 (종류 t)는

var type = typeof (IDataTypeConverter<>); 
var types = AppDomain.CurrentDomain.GetAssemblies() 
        .SelectMany(x => x.GetTypes()) 
        .Where(x => type.IsAssignableFrom(x) && !x.IsInterface); 

foreach (var t in types) 
{ 
    var instance = (IDataTypeConverter)Activator.CreateInstance(t); 
    PropertiesConverter.Add(t, instance); 
} 

이 인터페이스의 구현의 예입니다 내 목록에서 십진수를 유형으로 가져 오지 않습니까?

답변

2

거의 다 왔어. 수업에 개방형 제네릭 유형IDataTypeConverter<>에 할당 할 수 있는지 확인하고 있습니다.

var type = typeof (IDataTypeConverter<>); var types = AppDomain.CurrentDomain.GetAssemblies() .SelectMany(x => x.GetTypes()) .Where(x => !x.IsInterface) //ignore interface definitions .Where(x => x.GetInterfaces() //for each interface implemented .Where(i => i.IsGenericType) //if they're a generic interface .Any(i => i.GetGenericTypeDefinition() == type)); //check its open-generic 

내가 확인하는 간단한 방법이있을 수 있습니다 생각 (TDataType 또는 다른 데이터 유형) IDataTypeConverter<decimal>처럼
제네릭 형식 폐쇄에 그들은 단지 할당 할 수 있습니다,하지만이 일을 할 것입니다. 유형에 대한 모든 인터페이스를 가져오고 일반 인터페이스 인 각 인터페이스에 대해 기본 열린 일반 정의가 IDataTypeConverter<>인지 확인합니다.

편집 : type을 위해 대신 typeof(IDataTypeConverter<decimal>)를 할당 경우 무슨 뜻인지 설명하는 또 다른 방법은, 기존의 코드는 를 작동합니다. 이 타입은 IDataTypeConverter<decimal>에 할당 할 수 있기 때문에 작동하지만 IDataTypeConverter<>에는 할당 할 수 없습니다. C#에서는 아무런 의미가 없기 때문입니다.

+0

I 인터페이스의 종류를 얻을 수있는 방법을 어떤 생각? IDataTypeConverter = DecimalConverter 대신 십진수 – Freddy

+1

@ Freddy : 네가 인터페이스 유형을 지정하면 ['GetGenericArguments()'] (http://msdn.microsoft.com/en-us/library/system.type)을 사용할 수 있습니다. .getgenericarguments.aspx)를 사용하여 'decimal' 일반 인수를 가져옵니다. –

2

유형 변수에 제네릭 형식 정의가 포함되어 있습니다. IDataTypeConverter는 해당 자손이 아닙니다. 따라서 IDataTypeConverter는 IDataTypeConverter <>에서 할당 할 수 없습니다.

Console.WriteLine(typeof(IDataTypeConverter<>).IsGenericTypeDefinition); 
Console.WriteLine(typeof(IDataTypeConverter<decimal>).IsGenericTypeDefinition); 

몇 가지 일반적인 유형은 술어 사용할 수있는 동일한 제네릭 형식 정의의 것을 확인하려면 :

x => .GetInterfaces() 
    .Any(item => item.IsGenericType && item.GetGenericTypeDefinition() == type) 
관련 문제