리플렉션 에서 C#
특정 System.Type
유형이 일부 인터페이스를 모델링 하는지 여부를 결정하는 방법을 제공 합니까 ?
public interface IMyInterface {}
public class MyType : IMyInterface {}
// should yield 'true'
typeof(MyType)./* ????? */MODELS_INTERFACE(IMyInterface);
답변
몇 가지 선택 사항이 있습니다.
-
typeof(IMyInterface).IsAssignableFrom(typeof(MyType))
-
typeof(MyType).GetInterfaces().Contains(typeof(IMyInterface))
일반적인 인터페이스의 경우 조금 다릅니다.
typeof(MyType).GetInterfaces().Any(i => i.IsGenericType && i.GetGenericTypeDefinition() == typeof(IMyInterface<>))
답변
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;
}
세 가지 이유로 이것이 올바른 릴리스라고 생각합니다.
- IsAssignableFrom이 아닌 GetInterfaces를 사용합니다. IsAssignableFrom이 결국 여러 검사 후 GetInterfaces를 호출 한 후 더 빠릅니다.
- 로컬 배열을 반복하므로 바운드 검사가 없습니다.
- 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>();