programing

유형이 제네릭 인터페이스를 구현하는지 확인

firstcheck 2021. 1. 14. 08:32
반응형

유형이 제네릭 인터페이스를 구현하는지 확인


MyType이라는 유형이 있다고 가정 해 보겠습니다. 다음을 수행하고 싶습니다.

  1. MyType이 일부 T에 대해 IList 인터페이스를 구현하는지 확인합니다.
  2. (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

반응형