5

我有 2 种类型:BaseQuestionQuestion. Question从 继承一些属性BaseQuestion。现在我已经创建了一个 Web API 来提供一个BaseQuestion可用的。该Question数据类型具有我不想提供的其他属性。我有一个检索 a 的方法,Question我最初的计划是将它隐式向上转换为BaseQuestion. 我认为它会丢失所有我不想访问的额外属性,我可以将其归还。好吧,它没有。这就是我所做的:

Question q = allQuestions[0];
BaseQuestion bq = q;
string type = bq.GetType().ToString();

bq 的类型仍然是“问题”。我无法访问 BaseQuestion 属性,但我仍然可以在调试器中看到它们,并且它们位于我发送给客户端的 JSON 输出中。

关于如何“强制” bq 成为类型BaseQuestion而不具有子类中定义的任何属性的任何想法?

4

2 回答 2

11

类型转换不会改变对象的性质,它只会改变你对对象的看法。当您对基本类型进行类型转换时,您正在通过一个过滤器查看对象,该过滤器只能看到在基本类型上定义的成员,而不管实际对象中定义的其他任何内容。

当您从 Web 服务调用返回一个对象时,它将被序列化并通过网络发送回的实际对象——它的所有可序列化成员。

您可以用来防止派生 Question 类的成员返回给 API 调用者的一种技术是禁止对 Question 类中声明的成员进行序列化。.NET 中有多个序列化子系统,但如果您使用 XmlSerialization,您将使用 [XmlIgnore] 属性装饰在 Question 类中声明的成员,以防止它们被 XmlSerialization 序列化。如果您使用的是不同的序列化子系统,则需要找出该系统中的类似物。

另一种可能性是为您的 Web API 服务定义接口契约。您的 BaseQuestion 和 Question 类将实现这些合同接口中的一个或多个。我相信这会将序列化限制为仅在合约接口中定义的属性,而不管实际对象是什么。

如果一切都失败了,蛮力解决方案是在临时变量中构造 BaseQuestion 的实例,将相关属性从实际的 Question 对象复制到 temp 对象,然后返回 temp 对象。这是粗鲁和粗鲁的,必须有更好的方法,但它会起作用。

于 2012-08-24T02:47:54.433 回答
1

类型转换只改变对对象的引用类型,而不是对象本身。

无论引用它的变量类型如何,调用.GetType()的实例都Question将始终返回类型。Question

如果您想要基本类型,那么您需要调用该.BaseType类型的属性。

所以,像这样:

string type = q.GetType().BaseType.ToString();
于 2012-08-24T03:20:11.667 回答