什么时候是一个特定的类型实际上是一个System.Object?

问题描述:

在我的WPF应用程序,我在的IValueConverter下面的代码位:什么时候是一个特定的类型实际上是一个System.Object?

if (value.GetType().BaseType != typeof(Member)) 
    return string.Empty; 

Member是自动生成的实体框架对象。当绑定到List<Member>的属性时,它按预期工作 - 转换器接受此比较并不返回。

我目前正在为这部分代码编写一些单元测试。所以,我这个测试吧:

MemberConverter conv = new MemberConverter(); 
Member mem = new Member{ MemberName = "Arnold" }; 
var result = conv.Convert((Member)mem, typeof(string), null, null); 

而且result回来为String.Empty

当我逐句通过代码时,它的类型比较失败了。我自己产生的mem对象有BaseTypeSystem.Object

我可以理解为什么基本类型可能会返回一个普通的旧对象。但我不明白为什么在这两种情况下表现不同。有人可以解释,并告诉我我做错了什么?

+1

每个对象始终是一个'System.Object' – Jodrell 2014-11-03 16:58:54

+0

基本类型是给定类型继承其成员的直接类型。对于直接从'Member'派生的生成类型,其基类型也是'Member'。但是,如果您传递'Member'的实例,则会询问'Member'类型的基类型。由于所有对象(_unusally_)都从'System.Object'继承,所以你会得到这种类型。 – IllidanS4 2014-11-03 17:30:17

实体框架正在创建一个动态类型,以会员为基础类型,覆盖您提供的任何虚拟属性以提供自动'延迟加载'魔术。

你可能会考虑这样做,而不是:

if (!typeof(Member).IsAssignableFrom(value.GetType())) 

或者,更直接,因为你有一个实例,而不仅仅是一个类型

if (!(value is Member))