如何在不改变原始类的情况下向我的类中添加属性

3
我有一个从JSON输入字符串创建的模型。然而,其中一个名为PortfolioHolding的类没有我想在最终结果中返回的字段。我的当前解决方案是在现有的Model类中添加该字段。但是,在调试时,它失败了,因为JSON输入字符串不正确。我尝试在我想要在反序列化过程中忽略的字段中添加[JsonIgnore],但这并没有帮助。

如何动态添加属性到我的类,并根据我的JSON输入文件使输入正确?

public class PortfolioHolding
    {
        public string fundIdentifier { get; set; }
        public int fundRating { get; set; }
        public double fundExpenseRatio { get; set; }
        public double fundWeight { get; set; }
        [JsonIgnore]
        public double fundAlpha { get; set; } //MODIFIED by adding fundAlpha attribute
    }

实际的模型中没有包含fundAlpha,我的测试在调试期间都通过了。

你想将这个类序列化为JSON并添加额外的字段吗? - Roman
使用可空类型。public double? fundAlpha { get; set; } - Nibor
各位,能否解释一下为什么这里不起作用?为什么JsonIgnore不足够呢? - MistyK
@dasblinkenlight:我实际上尝试了已经发布的解决方案,但那并没有起作用。 - Mihir Patel
@Roma,由于重复的解决方案没有起作用,我投票重新打开这个问题。 - Sergey Kalinichenko
显示剩余3条评论
3个回答

3
您可以从PortfolioHolding创建匿名类型并对其进行序列化:
PortfolioHolding ph = new PortfolioHolding();
// fill ph

var anonymous = new
{
    fundIdentifier = ph.fundIdentifier,
    fundRating = ph.fundRating,
    fundExpenseRatio = ph.fundExpenseRatio,
    fundWeight = ph.fundWeight,
    fundAlpha = neededValue // here your value from ph or any other
};

var json = JsonConvert.SerializeObject(anonymous);

// deserialize

var deserializedAnonymous = JsonConvert.DeserializeAnonymousType(json, anonymous);

ph.fundExpenseRatio = deserializedAnonymous.fundExpenseRatio;
//other properties

谢谢你的回答!添加匿名类型的最佳方式是什么?这里有更多关于这个问题的代码:http://stackoverflow.com/questions/42395116/c-sharp-return-multiple-values-in-an-object。 - Mihir Patel
1
@MihirPatel,匿名类型仅在序列化/反序列化时需要 - 你应该在执行此操作之前创建它。 - Roman

2

很抱歉之前提供的解决方案不够好。

我理解您想要使用相同的模型类从JSON中获取输入,并将该模型返回给项目外的某个人。

有两种可能的解决方案。

1)例如,在同一库或命名空间中从数据库(可以是文件)读取数据(JSON)的情况下,您可以使用internal关键字。在同一命名空间中,您将可以访问该属性,在命名空间之外则不能。

2)您可以从结果集中选择匿名对象,例如:

resultSet.Select(a => new { a.col1, a.col2, a.col3, /*and skip the one which you don't want to be selected*/})

另一个属性是什么?不太明白。 - Mihir Patel
在第一个类PortfolioHolding上出现错误:声明类型缺少部分修饰符... - Mihir Patel

0

使用ExpandoObject

表示一个对象,其成员可以在运行时动态添加和删除。

dynamic expando = new ExpandoObject();
expando.Prop1= 1;
expando.Prop2 = "Test";

在反序列化时使用List:

var exConverter = new ExpandoObjectConverter();
dynamic obj = JsonConvert.DeserializeObject<List<ExpandoObject>>(json, exConverter);

我正在尽力不使用任何库,但是一旦我能用纯C#编写解决方案,我肯定会尝试这个解决方案。 - Mihir Patel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接