我有2种类型:BaseQuestionQuestionQuestion继承了BaseQuestion的某些属性。现在,我已经创建了一个Web API以使BaseQuestion可用。 Question数据类型具有我不想提供的其他属性。我有一个检索Question的方法,而我的最初计划是将其隐式升级为BaseQuestion。我以为它将丢失所有我不想使其可访问的额外属性,因此我可以将其返回。
好吧,事实并非如此。这是我的工作:

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

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

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

最佳答案

类型转换不会更改对象的性质,而只会更改您对对象的 View 。当您将类型转换为基本类型时,您正在通过一个过滤器查看该对象,该过滤器只能看到在基本类型上定义的成员,而不管实际对象中定义了什么。

当您从Web服务调用中返回对象时,将对实际对象进行序列化,并通过网络将其发送回-所有其可序列化成员。

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

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

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

关于C#:父类(super class)在转换后仍具有子类信息,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12102559/

10-09 05:48