Динамически добавлять свойство в класс - PullRequest
0 голосов
/ 26 ноября 2018

Каков наилучший способ динамического создания свойства класса?

Мне нужно создать данные JSON, на основе которых будет отправлено push-сообщение webhook.Я создал 2 класса, каждый из которых имеет несколько свойств, проблема в том, что даже если свойство не заполнено (по умолчанию NULL), push-уведомление webhook имеет неправильный формат.Чтобы избежать этого, я должен создавать свойства в зависимости от потребностей.

Есть ли способ, который позволит это?Чтобы представить, что мне нужно:

public class ChannelSettings
{
    public string channel { get; set; }
    public string username { get; set; }
    public string text { get; set; }
    public AttachSettings attachments { get; set; } //Here I would like to this property to be dynamic
}

public class AttachSettings
{
    public string fallback { get; set; }
    public string pretext { get; set; }
    public string text { get; set; }
    public string title { get; set; }
    public string author_name { get; set; }
    public string image_url { get; set; }
    public string author_icon { get; set; }
}
public string GenJSON(ChannelSettings channelSet)
{
    string output = JsonConvert.SerializeObject(channelSet);
    return output;
}

Ответы [ 6 ]

0 голосов
/ 27 ноября 2018

Спасибо за все очень полезные сообщения, я решил мою проблему, случай был экземпляром Attachment в Channel Class, мне пришлось создать его список:

public class ChannelSettings
{
    public string channel { get; set; }
    public string username { get; set; }
    public string text { get; set; }
    public List<AttachSettings> attachments { get; set; }

} 

, а затем не реализовать его, если значение в этой ситуации пустое, я получаю желаемый результат.

"{" channel ": null," username ":" user "," text ":" Test text "," attachments ": null} "

Это немного отличается от того, что я хотел в начале, но работает так же, поэтому никаких дальнейших изменений не требуется:)

0 голосов
/ 26 ноября 2018

Самая близкая вещь, которую я могу придумать, это ExpandoObject .Похоже, что он работает с любым слабо типизированным WebService, и вы упомянули JSON.

Internallty. Похоже, что он немного больше, чем Dictionary<string, object> с некоторым синтаксическим сахаром, изменением информации и неявными преобразованиями.Поэтому, если вы сомневаетесь, вы можете просто использовать старую добрую коллекцию.

0 голосов
/ 26 ноября 2018

Вы можете сделать тип параметра динамическим, а также сериализовать и десериализовать его, как показано ниже:

class Program
{
    static void Main(string[] args)
    {
        var channelSettings = new ChannelSettings();

        channelSettings.attachments = new AttachSettings();
        channelSettings.attachments.fallback = "test";


        var testSerialize = JsonConvert.SerializeObject(channelSettings);

        dynamic testDeserialize = JsonConvert.DeserializeObject<dynamic>(testSerialize);

        Console.WriteLine(testDeserialize.attachments.fallback); // here you can access the parameters
    }
}

public class ChannelSettings
{
    public string channel { get; set; }
    public string username { get; set; }
    public string text { get; set; }
    public dynamic attachments { get; set; } //Here i would like to this property was dynamic
}

Вывод: test

Также у @GPW есть другое решение, использующее словарь, который подходит для неизвестныхтип / размер параметров.

0 голосов
/ 26 ноября 2018

I думаю, что вы на самом деле хотите, чтобы AttachSettings был словарём или чем-то подобным?

{
    "channel":"one",
    "username":"user",
    "text":"text",
    "attachments":[
        "fallbackvalue":"somevalue",
        "author_name":"some author",
        "shoe_size":"12"
    ]
}
0 голосов
/ 26 ноября 2018

Не знаю, правильно ли я понял, но почему вы не сделаете это свойство необязательным?Просто использовать AttachSettings?и все должно быть хорошо.

0 голосов
/ 26 ноября 2018

Вы можете использовать ExpandoObject .

    dynamic expandoObject = new ExpandoObject();
    expandoObject.NewProperty =  "newValue";

Я думаю, пример поможет вам.

...