유형이 제네릭 인터페이스를 구현하는지 확인
MyType이라는 유형이 있다고 가정 해 보겠습니다. 다음을 수행하고 싶습니다.
- MyType이 일부 T에 대해 IList 인터페이스를 구현하는지 확인합니다.
- (1)에 대한 답이 '예'이면 T가 무엇인지 알아보세요.
이를 수행하는 방법은 GetInterface () 인 것 같지만 특정 이름으로 만 검색 할 수 있습니다. "IList 형식의 모든 인터페이스"를 검색하는 방법이 있습니까? (가능하면 인터페이스가 IList의 하위 인터페이스 인 경우 작동하는 경우에도 유용합니다.)
관련 : 유형이 특정 일반 인터페이스 유형을 구현하는지 확인하는 방법
// this conditional is necessary if myType can be an interface,
// because an interface doesn't implement itself: for example,
// typeof (IList<int>).GetInterfaces () does not contain IList<int>!
if (myType.IsInterface && myType.IsGenericType &&
myType.GetGenericTypeDefinition () == typeof (IList<>))
return myType.GetGenericArguments ()[0] ;
foreach (var i in myType.GetInterfaces ())
if (i.IsGenericType && i.GetGenericTypeDefinition () == typeof (IList<>))
return i.GetGenericArguments ()[0] ;
편집 : 하더라도 myType
구현이 IDerivedFromList<>
아니라 직접 IList<>
, IList<>
에 의해 반환 된 배열에 표시됩니다 GetInterfaces()
.
업데이트 :myType
문제의 일반 인터페이스가있는 가장자리 케이스에 대한 검사를 추가했습니다 .
리플렉션 (및 일부 LINQ)을 사용하면 다음과 같이 쉽게 할 수 있습니다.
public static IEnumerable<Type> GetIListTypeParameters(Type type)
{
// Query.
return
from interfaceType in type.GetInterfaces()
where interfaceType.IsGenericType
let baseInterface = interfaceType.GetGenericTypeDefinition()
where baseInterface == typeof(IList<>)
select interfaceType.GetGenericArguments().First();
}
첫째, 유형에 대한 인터페이스를 가져오고 제네릭 유형 인 인터페이스 만 필터링합니다.
그런 다음 해당 인터페이스 유형에 대한 일반 유형 정의를 가져 와서 IList<>
.
거기에서 원래 인터페이스에 대한 일반적인 인수를 얻는 것은 간단한 문제입니다.
유형은 여러 IList<T>
구현을 가질 수 있으므로이 IEnumerable<Type>
반환 되는 이유 입니다.
public static bool Implements<I>(this Type type) where I : class
{
if (!typeof(I).IsInterface)
{
throw new ArgumentException("Only interfaces can be 'implemented'.");
}
return typeof(I).IsAssignableFrom(type);
}
도우미 메서드 확장으로
public static bool Implements<I>(this Type type, I @interface) where I : class
{
if(((@interface as Type)==null) || !(@interface as Type).IsInterface)
throw new ArgumentException("Only interfaces can be 'implemented'.");
return (@interface as Type).IsAssignableFrom(type);
}
사용 예 :
var testObject = new Dictionary<int, object>();
result = testObject.GetType().Implements(typeof(IDictionary<int, object>)); // true!
Anton Tykhyy의 제안을 사용하여 다음은 특정 유형이 하나의 지정된 제네릭 유형 매개 변수로 제네릭 인터페이스를 구현하는지 확인하는 작은 확장 메서드입니다.
public static class ExtensionMethods
{
/// <summary>
/// Checks if a type has a generic interface.
/// For example
/// mytype.HasGenericInterface(typeof(IList<>), typeof(int))
/// will return TRUE if mytype implements IList<int>
/// </summary>
public static bool HasGenericInterface(this Type type, Type interf, Type typeparameter)
{
foreach (Type i in type.GetInterfaces())
if (i.IsGenericType && i.GetGenericTypeDefinition() == interf)
if (i.GetGenericArguments()[0] == typeparameter)
return true;
return false;
}
}
Type[] typeArray2 = c.GetInterfaces();
for (int num2 = 0; num2 < typeArray2.Length; num2++)
{
if (this == typeArray2[num2])
{
return true;
}
}
--http://www.hanselman.com/blog/DoesATypeImplementAnInterface.aspx
If i understand your question correctly, this is what you are trying to do. If not, please explain further.
public class MyType : ISomeInterface
{
}
MyType o = new MyType();
if(o is ISomeInterface)
{
}
edit: if you change your question, please add the fact that you edited..because now my answer looks like it doesn't belong.
In that case, here is a very large LINQ
var item = typeof(MyType).GetInterfaces()
.Where(x => x.IsGenericType && x.GetGenericTypeDefinition() == typeof(IList<>))
.Select(t => t.GetGenericArguments().First())
.FirstOrDefault();
if( item != null )
//it has a type
ReferenceURL : https://stackoverflow.com/questions/1121834/finding-out-if-a-type-implements-a-generic-interface
'programing' 카테고리의 다른 글
Xcode 5 앱 제출 문제 (0) | 2021.01.14 |
---|---|
손상된 HDFS 파일을 수정하는 방법 (0) | 2021.01.14 |
JSON에 덤프는 추가 큰 따옴표와 따옴표 이스케이프를 추가합니다. (0) | 2021.01.14 |
TestNG를 사용한 스프링 종속성 주입 (0) | 2021.01.14 |
Java : Java에서 배열을 한 줄로 초기화하는 방법은 무엇입니까? (0) | 2021.01.14 |