문제

다음 코드를 고려하십시오.

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;
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top