أفضل طريقة لمعرفة ما اذا كان System.Type هو سليل فئة معينة

StackOverflow https://stackoverflow.com/questions/1433750

سؤال

والنظر في التعليمة البرمجية التالية:

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 - IsAssignableFrom أضعف بمعنى أنه إذا كان لديك كائنين أ و ب بحيث هذا صحيح:

a = b;

وبعد ذلك typeof(A).IsAssignableFrom(b.GetType()) غير صحيح - لذلك يمكن أن يكون فئة فرعية من ب، أو نوع واجهة

.

في المقابل، فإن a.GetType().IsSubclassOf(typeof(B)) يعود صحيحا إلا إذا كان من فئة فرعية من ب. وبالنظر إلى اسم طريقة الملحق الخاص بك، وانا اقول يجب عليك استخدام IsSubclassOf بدلا من IsAssignable ل؛

وأعتقد أنك تبحث عن هذا Type.IsSubclassOf ( )

وتحرير:

وأنا لا أعرف الاحتياجات الخاصة بك ولكن قد يكون الذي يكون أفضل طريقة:

bool isDescendant = cValue is C;
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top