답변:
if (object is IBlah)
또는
IBlah myTest = originalObject as IBlah
if (myTest != null)
if (object is IBlah iblah) { iblah.SomeMethod(); }
컴파일 타임에 인터페이스 유형을 알고 테스트중인 유형의 인스턴스가있는 경우 is
or as
연산자를 사용하는 것이 올바른 방법입니다. 다른 사람이 언급하지 않은 것 Type.IsAssignableFrom
:
if( typeof(IMyInterface).IsAssignableFrom(someOtherType) )
{
}
나는 이것이 반환 된 배열을 보는 것보다 훨씬 깔끔하고 GetInterfaces
클래스 작업도 장점 이라고 생각합니다 .
typeof(IList).IsAssignableFrom(someType)
하지 않고을 사용 하십시오 <>
.
예를 들어 :
if (obj is IMyInterface) {}
수업 :
typeof(MyClass).GetInterfaces()
인터페이스 가 포함되어 있는지 확인하십시오 .
확인 후 typecasted 객체를 사용하려는 경우
C # 7.0 이후 :
if (obj is IMyInterface myObj)
이것은
IMyInterface myObj = obj as IMyInterface;
if (myObj != null)
.NET Docs : # Type pattern 과 패턴 일치를 참조하십시오.is
"is"연산자를 사용하여 테스트하는 것 외에도 메소드를 장식하여 전달 된 변수가 다음과 같이 특정 인터페이스를 구현하는지 확인할 수 있습니다.
public static void BubbleSort<T>(ref IList<T> unsorted_list) where T : IComparable
{
//Some bubbly sorting
}
이것이 어떤 .Net 버전으로 구현되었는지 잘 모르겠으므로 버전에서 작동하지 않을 수 있습니다.
최근 Andrew Kennan의 답변을 사용해 보았지만 어떤 이유로 든 작동하지 않았습니다. 대신 이것을 사용하고 작동했습니다 (참고 : 네임 스페이스를 작성해야 할 수도 있습니다).
if (typeof(someObject).GetInterface("MyNamespace.IMyInterface") != null)
변수를 메소드에 전달하고 인터페이스 또는 객체인지 확실하지 않은 상황이있었습니다.
목표는 다음과 같습니다.
나는 이것을 다음과 같이 달성했다.
if(!typeof(T).IsClass)
{
// If your constructor needs arguments...
object[] args = new object[] { my_constructor_param };
return (T)Activator.CreateInstance(typeof(T), args, null);
}
else
return default(T);
이것은 작동해야합니다 :
MyInstace.GetType().GetInterfaces();
그러나 너무 좋은 :
if (obj is IMyInterface)
또는 심지어 (아주 우아하지 않음) :
if (obj.GetType() == typeof(IMyInterface))