Использование типа данных «Объект» в C#, содержит ли он элементы? - PullRequest
0 голосов
/ 07 февраля 2020

Я немного запутался в использовании ключевого слова "объект" в C#. Что может и не может быть использовано для этого. Можете ли вы получить доступ к члену?

Например, я сделал небольшой фрагмент кода для десериализации строки JSON.

public static object DeserializeString(string jsonstring)
{
    // Deserialize the data
    object testObject = JsonConvert.DeserializeObject<object>(jsonstring);
    return testObject;
}

Когда я использую десериализатор для создания объекта I не может получить доступ к любым членам. Я знаю, что это может быть глупый вопрос, потому что я не определил класс, у которого есть члены, желающие получить к нему доступ. Я стараюсь избегать десятков занятий.

Заранее спасибо!

1 Ответ

4 голосов
/ 07 февраля 2020

Я немного озадачен использованием ключевого слова "объект" в C#. Что может и не может быть использовано для этого. Можете ли вы получить доступ к члену?

C# по умолчанию является статически типизированным языком . То есть, если у вас есть выражение определенного типа времени компиляции, вы можете получить доступ только к членам этого типа. Это система безопасности; он говорит: «У меня есть только гарантия, что члены этого типа доступны, поэтому не позволяйте мне получать доступ к любым другим членам».

Если у вас есть выражение типа object, вы можете получить доступ к членам из object - ToString, GetType и т. д.

Если вы хотите отключить эту систему безопасности, используйте dynamic вместо object, и тогда вы сможете позвонить любому участнику тебе нравится; если вы позвоните участнику, который не существует, ваша программа выполнит запрос sh. Когда вы выключаете систему безопасности, система безопасности выключается, и вы становитесь ответственным за обеспечение безопасности .


ПОЯСНЕНИЕ: Комментатор Брайан правильно указывает, что в спецификации c В случае JSON объектов поведение по умолчанию для плохого динамического доступа c к элементу - создание нулевого значения, а не сбой; конечно, большую часть времени после создания нуля, потому что член неожиданно отсутствует, следующая вещь, которая произойдет, это нулевая разыменование cra sh, так что на самом деле там не так много дополнительного запаса прочности, но есть по крайней мере некоторые.


Мой вопрос к вам был:

Если вы позвоните GetType().ToString() на объекте, что вы получите?

Ответ был Newtonsoft.Json.Linq.JObject. Таким образом, в этом случае вы можете получить доступ к членам этого типа следующим образом:

JObject jo = (JObject)testObject;

(при условии, что в ваших директивах есть using Newtonsoft.Json.Linq;).

Опять ваша программа обработает sh если объект на самом деле не относится к этому типу.

Вы можете выполнить безопасный тип теста с помощью:

if (testObject is JObject jo)
{
  var r = jo.Root;
  ...

Я стараюсь не делать десятки классов.

C# is статически типизированный язык; это поощряет создание классов. Опять же, это система безопасности. Инвестируйте в его правильное использование!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...