我怎样才能只得到阴影 属性,而不是基础 属性,才能序列化 JSON?

How do I get only a shadowed property, not the base property, to get JSON serialized?

在我的 ASP.NET MVC web 应用程序中,我使用内置的 Controller.Json() 方法序列化对象并将其发送回客户端以响应 AJAX 调用。被序列化的对象的 class 继承自另一个 class,具有一些共享的 属性 名称。这是故意的,因为我需要 属性 名称来匹配正在发生的某些反射。我是 "shadowing" 派生 class 中的那些属性,因此它们可以是与基础 class 中的同名对应物不同的类型。这是一个简化的例子:

public class BaseModel
{
    public string Title { get; set; }
    public decimal CleanUpHours { get; set; }
    public decimal InstallHours { get; set; }
}

public class DerivedModel : BaseModel
{
    public new BucketHoursWithCalculations CleanUpHours { get; set; }
    public new BucketHoursWithCalculations InstallHours { get; set; }
}

当我序列化 DerivedModel 的实例时,客户端上的 JSON 对象仅包含 CleanUpHoursInstallHoursdecimal 版本,而不是我的习惯 class BucketHoursWithCalculations.

在序列化之前检查 Visual Studio 中的对象显示了这些属性的基础版本和派生版本,如此处所示(请原谅所有额外的属性——我上面的示例 classes 是比我实际使用的更简单,但原理是一样的):

这是该对象在序列化为 JSON 后在客户端上的样子:

如您所见,derived/shadowed 属性未被序列化,而基本属性被序列化,但仅在存在名称冲突的情况下(例如,Title 属性 在基本模型中序列化就好了)。

如何才能仅序列化存在名称冲突的隐藏属性?我不相信更改基本属性的访问修饰符(即从 publicprotected 或其他东西)在我的情况下会起作用,因为 BaseModel 被 [=45= 使用],并且必须具有 public 属性。任何帮助将不胜感激。

一个想法是在用于小时属性的基本模型上定义类型参数。然后,为 decimalBucketHoursWithCalculations 定义派生模型。我很想知道 BucketHoursWithCalculations 如何序列化为 JSON,但无论如何 CleanUpHoursInstallHours 属性都应该被序列化。

// use a type parameter on the base model that must be specified
// in derived models.
public class BaseModel<THours>
{
    public string Title { get; set; }
    public THours CleanUpHours { get; set; }
    public THours InstallHours { get; set; }
}

// hours are specified as decimals
public class DecimalModel : BaseModel<decimal>
{
}

// hours are specified as BucketHoursWithCalculations    
public class BucketHoursWithCalculationsModel : BaseModel<BucketHoursWithCalculations>
{
}

// usage
DecimalModel d = new DecimalModel();
d.CleanUpHours = 1.0M; // CleanUpHours is a decimal here

BucketHoursWithCalculationsModel b = new BucketHoursWithCalculationsModel();
b.CleanUpHours = new BucketHoursWithCalculations();
b.CleanUpHours.SomeProperty = 1.0M;