[C#] 형식이 C # 리플렉션을 사용하여 인터페이스를 구현하는지 확인하는 방법

리플렉션 에서 C#특정 System.Type유형이 일부 인터페이스를 모델링 하는지 여부를 결정하는 방법을 제공 합니까 ?

public interface IMyInterface {}

public class MyType : IMyInterface {}

// should yield 'true'
typeof(MyType)./* ????? */MODELS_INTERFACE(IMyInterface);



답변

몇 가지 선택 사항이 있습니다.

  1. typeof(IMyInterface).IsAssignableFrom(typeof(MyType))

  2. typeof(MyType).GetInterfaces().Contains(typeof(IMyInterface))

일반적인 인터페이스의 경우 조금 다릅니다.

typeof(MyType).GetInterfaces().Any(i => i.IsGenericType && i.GetGenericTypeDefinition() == typeof(IMyInterface<>))


답변

사용 Type.IsAssignableFrom:

typeof(IMyInterface).IsAssignableFrom(typeof(MyType));


답변

typeof(IMyInterface).IsAssignableFrom(someclass.GetType());

또는

typeof(IMyInterface).IsAssignableFrom(typeof(MyType));


답변

public static bool ImplementsInterface(this Type type, Type ifaceType)
{
    Type[] intf = type.GetInterfaces();
    for(int i = 0; i < intf.Length; i++)
    {
        if(intf[ i ] == ifaceType)
        {
            return true;
        }
    }
    return false;
}

세 가지 이유로 이것이 올바른 릴리스라고 생각합니다.

  1. IsAssignableFrom이 아닌 GetInterfaces를 사용합니다. IsAssignableFrom이 결국 여러 검사 후 GetInterfaces를 호출 한 후 더 빠릅니다.
  2. 로컬 배열을 반복하므로 바운드 검사가 없습니다.
  3. Type에 대해 정의 된 == 연산자를 사용하므로 Equals 메소드보다 안전합니다 (Contains 호출이 결국에 사용됨).

답변

난 그냥했다:

public static bool Implements<I>(this Type source) where I : class
{
  return typeof(I).IsAssignableFrom(source);
}

나는 말할 수 있었으면 where I : interface하지만 interface일반적인 매개 변수 제약 조건은 아닙니다. class최대한 가깝습니다.

용법:

if(MyType.Implements<IInitializable>())
  MyCollection.Initialize();

나는 Implements그것이 더 직관적이기 때문에 방금 말했다 . 나는 항상 IsAssignableFrom플립 플롭된다.


답변

최적의 성능을 위해 Jeff의 답변 수정 (Pierre Arnaud의 성능 테스트 덕분에) :

var type = typeof(MyType);
var implementsInterface = typeof(IMyInterface).IsAssignableFrom(type) && type.IsClass;

지정된 인터페이스를 구현하는 모든 유형을 찾으려면 다음을 수행하십시오 Assembly.

var implementations = typeof(TypeInTargetAssembly).Assembly.GetTypes()
                          .Where(t => typeof(IMyInterface).IsAssignableFrom(t) && t.IsClass);


답변

다른 사람이 이미 언급 한 것처럼 : Benjamin Apr 10 ’13 at 22:21 “

주의를 기울이지 않고 IsAssignableFrom에 대한 인수를 거꾸로 얻는 것이 쉬웠습니다. 이제 GetInterfaces를 사용하겠습니다. p –

또 다른 방법은 “가장 일반적인”사고 방식을 어느 정도 충족시키는 짧은 확장 방법을 만드는 것입니다. (그리고 이것은 개인의 취향에 따라 약간 “보다 자연스럽게”만드는 개인적 선택이 거의 없다는 데 동의했습니다. ) :

public static class TypeExtensions
{
    public static bool IsAssignableTo(this Type type, Type assignableType)
    {
        return assignableType.IsAssignableFrom(type);
    }
}

그리고 좀 더 일반적인 것이 아닌 이유는 무엇입니까?

public static class TypeExtensions
{
    public static bool IsAssignableTo(this Type type, Type assignableType)
    {
        return assignableType.IsAssignableFrom(type);
    }

    public static bool IsAssignableTo<TAssignable>(this Type type)
    {
        return IsAssignableTo(type, typeof(TAssignable));
    }
}

나는 그것이 훨씬 자연 스럽지만 다시 한 번 매우 개인적인 의견의 문제라고 생각합니다.

var isTrue = michelleType.IsAssignableTo<IMaBelle>();