System.type가 주어진 클래스의 후손인지 확인하는 가장 좋은 방법
-
07-07-2019 - |
문제
다음 코드를 고려하십시오.
public class A
{
}
public class B : A
{
}
public class C : B
{
}
class D
{
public static bool IsDescendantOf(this System.Type thisType, System.Type thatType)
{
/// ???
}
void Main()
{
A cValue = new C();
C.GetType().IsDescendantOf(cValue.GetType());
}
}
ISDESCENDANTOF를 구현하는 가장 좋은 방법은 무엇입니까?
해결책
type.issubclassof () 현재 유형으로 표시되는 클래스가 지정된 유형으로 표시되는 클래스에서 파생되는지 여부를 결정합니다.
다른 팁
당신은 아마 찾고있을 것입니다 type.isassignablefrom.
나는 이것이 당신의 질문에 직접 대답하지는 않는다는 것을 알고 있지만, 당신은 당신의 예제의 메소드 대신 이것을 사용하는 것을 고려할 수 있습니다.
public static bool IsDescendantOf<T>(this object o)
{
if(o == null) throw new ArgumentNullException();
return typeof(T).IsSubclassOf(o.GetType());
}
따라서 다음과 같이 사용할 수 있습니다.
C c = new C();
c.IsDescendantOf<A>();
또한, type.issubclassof와 type.isassignablefrom의 차이에 대한 질문에 답하기 위해 - issassignablefrom에서 두 개의 객체 A와 B가 있으면 유효하다는 의미에서 약해집니다.
a = b;
그 다음에 typeof(A).IsAssignableFrom(b.GetType())
사실입니다. 따라서 A는 B의 서브 클래스 또는 인터페이스 유형 일 수 있습니다.
대조적으로, a.GetType().IsSubclassOf(typeof(B))
a가 b의 서브 클래스 인 경우에만 진실을 반환합니다. 확장 방법의 이름을 감안할 때, 나는 당신이 issastable 대신 issubclassof를 사용해야한다고 말합니다.
나는 당신이 이것을 찾고 있다고 생각합니다 type.issubclassof ()
편집하다:
나는 당신의 요구 사항을 모르지만 그것이 가장 좋은 방법 일 수 있습니다.
bool isDescendant = cValue is C;
제휴하지 않습니다 StackOverflow