2010-09-16 136 views
1

我已经完成了一次这么多次,但是我的记忆让我失望了,我觉得有点愚蠢。如何比较两个System.Types?

如何比较两种运行时类型?我假设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) 
+0

试过type.Equals? – jgauffin 2010-09-16 13:04:28

+2

为什么假设您可以快速测试它? – 2010-09-16 13:07:04

+0

不要忘记标记你最喜欢的答案。 – Steven 2010-11-21 16:40:46

回答

5

==运营商应该做的类型平等检查的伎俩。例如,通过:

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

看来你是对的。我不知道这一点,但MSDN文档似乎同意:“表示类型的Type对象是唯一的;也就是说,当且仅当它们表示相同类型时,两个Type对象引用才引用同一个对象。使用引用相等比较Type对象。“ http://msdn.microsoft.com/en-us/library/system.type.aspx – luksan 2010-09-16 18:56:17

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()); 
+1

您的IsAssignableFrom调用错误(b为false)。你想要:typeof(Cat).IsAssignableFrom(obj.GetType()) – 2010-09-16 13:11:50

+0

@Jb:你是对的。修复。我似乎总是打开这个电话。 – Steven 2010-09-16 13:24:00

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(); 
}