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

これは私の理想的ではありませんが、改善されたアプローチです。

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 に答える
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 に答える