2010-09-16 113 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(); 
}