【问题标题】:Dynamically change serialized datamember name in .NET WebAPI在 .NET WebAPI 中动态更改序列化数据成员名称
【发布时间】:2013-05-10 16:30:21
【问题描述】:

我正在使用 .NET WebAPI 构建自定义 API。我要做的是在运行时动态更改属性数据成员名称。我知道我可以使用 DataMember(Name="whateverId") 覆盖名称,但我希望能够动态更改它。

请参阅下面的示例。该类有一个 id 和一个 name 字段。有时我可能希望它显示为“eventId”和“name”。其他时候我可能希望它是“subEventId”和“name”。

关于如何动态执行此操作的任何想法。

[DataContract(Namespace = "", Name = "pair")]
public class idName
{
    [DataMember(EmitDefaultValue = false]
    [JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
    public int? id { get; set; }

    [DataMember(EmitDefaultValue = false)]
    [JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
    public string name { get; set; }

    public idName()
    {

    }

    public idName(int? id, string name, string serializeIdName = "id")
    {
        this.id = id;
        this.name = name;
    }
}

我可以在代码中创建一个新的 datamemberattribute,但我不知道下一步该做什么。

        var dma = new DataMemberAttribute();
        dma.Name = "whateverId";   

谢谢!

【问题讨论】:

标签: asp.net .net asp.net-web-api


【解决方案1】:

你可以使用序列化回调,像这样:


[DataContract]
public class IdName
{
    public int? Id { get; set; }

[DataMember(EmitDefaultValue = false)]
[JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
private string EventId { get; set; }

[DataMember(EmitDefaultValue = false)]
[JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
private string SubEventId { get; set; }

[DataMember(EmitDefaultValue = false)]
public string Name { get; set; }

[OnSerializing]
void OnSerializing(StreamingContext context)
{
    bool isEvent = true;
    if (isEvent)
    {
        this.EventId = this.Id.ToString();
    }
    else
    {
        this.SubEventId = this.Id.ToString();
    }
}

}

【讨论】:

  • 如果我想进行这样的调用,这将如何工作:var oId = new idName(5,"test","nameToSerializeAs")。我真的希望将一个名称传递给构造函数并将其序列化为该名称。
  • 好的,传递名称是一项新要求。您的原始帖子要求 ID 有时被序列化为 EventID,有时被序列化为 SubeventID,上面的代码应该注意这一点。
  • 您的帖子确实帮助我们想到了替代解决方案。不完全是动态的,但比拥有重复的对象要好。
【解决方案2】:

这是我不太理想但经过改进的方法。

public class idName
{

    [DataMember(EmitDefaultValue = false)]
    [JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
    public int? id { get; set; }

    #region Alternate id names

    [DataMember(EmitDefaultValue = false)]
    [JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
    public int? eventId { get; set; }

    [DataMember(EmitDefaultValue = false)]
    [JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
    public int? subEventId { get; set; }

    //as many other id's as needed.

    #endregion

    [DataMember(EmitDefaultValue = false)]
    [JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
    public string name { get; set; }

    public idName() { }

    public idName(int? id, string name, string displayIdName = "id")
    {
        this.name = name;

        PropertyInfo prop = this.GetType().GetProperty(displayIdName);
        if (prop == null)
            this.id = id;
        else
            prop.SetValue(this, id);

    }
}

【讨论】:

    猜你喜欢
    • 2021-07-14
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    • 2014-02-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-27
    • 1970-01-01
    相关资源
    最近更新 更多