1

我正在使用 .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";   

谢谢!

4

2 回答 2

0

您可以使用序列化回调,如下所示:


[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();
    }
}

}

于 2013-05-11T07:09:03.593 回答
0

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

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);

    }
}
于 2013-05-13T18:30:49.493 回答