如何比较两个System.Types?

时间:2010-09-16 12:59:46

标签: c#

我以前做了很多次,但是我的记忆让我失望,我觉得这有点愚蠢。

如何比较两种运行时类型?我假设System.Type不会覆盖==运算符,因此运算符执行引用相等性检查。

我想做一个价值平等。像:

someObject.GetType() == GetTypeFromSomeAssemblyUsingReflection(
                                                "Namespace.TypeName",
                                                objAssemblyToGetTheTypeFrom);

我可以使用IsAssignableFrom(),但这不会是我想要做的准确,因为它会扩大范围。我想把这些类型等同于我所做的:

if obj is Cat // where Cat is the name of a class

if ( (obj as Cat) != null )

4 个答案:

答案 0 :(得分:6)

==运算符应该执行类型相等检查的技巧。例如,这传递:

[Test]
public void TypeEquality()
{
    var monkey = new Monkey();
    var areEqual = (monkey.GetType() == typeof(Monkey));
    Assert.That(areEqual, Is.True);
}

答案 1 :(得分:4)

键入does override the equality operator,如文档中所示。

答案 2 :(得分:1)

如果您想要obj is Cat行为,IsAssignableFrom确实有效:

obj is Cat

相当于:

typeof(Cat).IsAssignableFrom(obj.GetType())

例如:

object siamese = new SiameseCat();

bool a = siamese is Cat;

// this is functionaly equivalent.
bool b = typeof(Cat).IsAssignableFrom(siamese.GetType());

答案 3 :(得分:0)

if ( obj1.GetType().FullName == obj2.GetType().FullName )

如果需要动态地从程序集创建对象,请使用以下方法:

public object createObjectFromAsm( string asm, string type )
{
    // get the domain
    AppDomain ad = AppDomain.CurrentDomain;
    // create the object handle from the assembly
    System.Runtime.Remoting.ObjectHandle sVal = ad.CreateInstanceFrom( asm, type );
    // unwrap the object
    return sVal.Unwrap();
}