C# 检查一个系统。类型对象是从另一个系统派生的。类型对象

C# 检查一个系统。类型对象是从另一个系统派生的。类型对象,c#,C#,type2是否源自type1 var type1 = typeof (ClassA); var type2 = typeof (ClassB); 如果c和当前类型表示相同的类型,或者 当前类型位于c的继承层次结构中,或者如果当前 类型是c实现的接口,或者如果c是泛型类型 参数和当前类型表示c的一个约束, 或者如果c表示值类型,而当前类型表示 可为空(VisualBasic中的可为空)。如果这些都没有,则为false 条件为true,或者如果c为null 如果c和当前类型表示相同的类型,或者

type2
是否源自
type1

var type1 = typeof (ClassA);
var type2 = typeof (ClassB);

如果c和当前类型表示相同的类型,或者 当前类型位于c的继承层次结构中,或者如果当前 类型是c实现的接口,或者如果c是泛型类型 参数和当前类型表示c的一个约束, 或者如果c表示值类型,而当前类型表示 可为空(VisualBasic中的可为空)。如果这些都没有,则为false 条件为true,或者如果c为null

如果c和当前类型表示相同的类型,或者 当前类型位于c的继承层次结构中,或者如果当前 类型是c实现的接口,或者如果c是泛型类型 参数和当前类型表示c的一个约束, 或者如果c表示值类型,而当前类型表示 可为空(VisualBasic中的可为空)。如果这些都没有,则为false 条件为true,或者如果c为null


您可以检查
Type.Basetype
()以查看您从哪些类型继承

所以你可以写一些像:

void Main()
{
    var type1 = typeof (ClassA);
    var type2 = typeof (ClassB);
    bool b = type1.IsAssignableFrom(type2);
    Console.WriteLine(b);
}

    class ClassA {}
    class ClassB : ClassA {}

感谢Daniel指出我在typeof中的错误

您可以检查
Type.Basetype
()以查看继承的类型

bool isDerived = type2.BaseType == type1;
所以你可以写一些像:

void Main()
{
    var type1 = typeof (ClassA);
    var type2 = typeof (ClassB);
    bool b = type1.IsAssignableFrom(type2);
    Console.WriteLine(b);
}

    class ClassA {}
    class ClassB : ClassA {}
感谢Daniel指出我在typeof中的错误

bool isDerived = type2.BaseType == type1;


如果您的目的是检查
Type2
是否是从
Type1
派生的类,则该方法可能适用。它返回true:

如果c参数表示的类型和当前类型表示类,并且当前类型表示的类派生自c表示的类;否则,错误。如果c和当前类型表示同一类,则此方法也返回false

在您的示例中,
isDerived
可以表示为:

var type1 = typeof(ClassA);
var type2 = typeof(ClassB);
bool isDerived = type2.IsSubClassOf(type1);

如果您的目的是检查
Type2
是否是从
Type1
派生的类,则该方法可能适用。它返回true:

如果c参数表示的类型和当前类型表示类,并且当前类型表示的类派生自c表示的类;否则,错误。如果c和当前类型表示同一类,则此方法也返回false

在您的示例中,
isDerived
可以表示为:

var type1 = typeof(ClassA);
var type2 = typeof(ClassB);
bool isDerived = type2.IsSubClassOf(type1);

您提出了近百个问题,我们希望您现在能够正确地编写实际问题和格式代码。您提出了近百个问题,我们希望您现在能够正确地编写实际问题和格式代码。-1。这在很多层面上都是错误的:1
typeof
只对类名有效,对变量无效,因此此代码不会编译。2.
System.type
变量的类型是-guess what-
System.type
,因此这种比较总是得到true。3.使用
BaseType
只能检查直接父子关系。哎哟。你说得对,谢谢!第三点:您可以通过检查
BaseType
BaseType
来“更高”,直到到达终点,这样您就可以访问对象继承行中的所有类型。但你是对的,我没有得到e。G更好的方法是只使用已经存在的方法来检查这一点。但我的第三点并不是投票失败的原因。另外两点是,你说得对<代码>IsubClassof是更好的方法。这在很多层面上都是错误的:1
typeof
只对类名有效,对变量无效,因此此代码不会编译。2.
System.type
变量的类型是-guess what-
System.type
,因此这种比较总是得到true。3.使用
BaseType
只能检查直接父子关系。哎哟。你说得对,谢谢!第三点:您可以通过检查
BaseType
BaseType
来“更高”,直到到达终点,这样您就可以访问对象继承行中的所有类型。但你是对的,我没有得到e。G更好的方法是只使用已经存在的方法来检查这一点。但我的第三点并不是投票失败的原因。另外两点是,你说得对
IsubClassof
是更好的方法。只需简单说明一下,问题的上下文并不清楚,但如果
type2==type1
,则返回
false
。严格地说,这个问题是为了检查派生类型,这取决于zgnilec计划如何使用它,这可能是一个问题。简单地说,问题的上下文并不清楚,但如果
type2==type1
,则返回
false
。严格来说,问题在于检查派生类型,这取决于zgnilec计划如何使用它,这可能是一个问题。请注意,
IsAssignableFrom
也将检查接口,而不仅仅是派生类型。也就是说,如果
type1
type2
实现的接口,它将返回
true
。然而,对于zgnilec的实际使用,这可能是需要的(或不重要的)行为。@ChrisSinclair True,我已经添加了信息注意,
IsAssignableFrom
还将检查接口,而不仅仅是派生类型。也就是说,如果
type1
type2
实现的接口,它将返回
true
。然而,对于zgnilec的实际使用,这可能是需要的(或不重要的)行为。@ChrisSinclair True,我已经添加了这些信息