如何比较两个System.Types?
我已经完成了一次这么多次,但是我的记忆让我失望了,我觉得有点愚蠢。如何比较两个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)
的==
运营商应该做的类型平等检查的伎俩。例如,通过:
[Test]
public void TypeEquality()
{
var monkey = new Monkey();
var areEqual = (monkey.GetType() == typeof(Monkey));
Assert.That(areEqual, Is.True);
}
看来你是对的。我不知道这一点,但MSDN文档似乎同意:“表示类型的Type对象是唯一的;也就是说,当且仅当它们表示相同类型时,两个Type对象引用才引用同一个对象。使用引用相等比较Type对象。“ http://msdn.microsoft.com/en-us/library/system.type.aspx – luksan 2010-09-16 18:56:17
如果你想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());
您的IsAssignableFrom调用错误(b为false)。你想要:typeof(Cat).IsAssignableFrom(obj.GetType()) – 2010-09-16 13:11:50
@Jb:你是对的。修复。我似乎总是打开这个电话。 – Steven 2010-09-16 13:24:00
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();
}
试过type.Equals? – jgauffin 2010-09-16 13:04:28
为什么假设您可以快速测试它? – 2010-09-16 13:07:04
不要忘记标记你最喜欢的答案。 – Steven 2010-11-21 16:40:46