Вопрос

у меня есть Dictionary(TKey, TValue) нравиться

Dictionary<int, ArrayList> Deduction_Employees = 
    new Dictionary<int, ArrayList>();

а позже я добавляю в этот список массивов анонимный тип, подобный этому

var day_and_type = new {
    TheDay = myDay,
    EntranceOrExit = isEntranceDelay
};

Deduction_Employees[Employee_ID].Add(day_and_type);

Теперь, как я могу распаковать эту переменную и получить доступ к этим свойствам??

Это было полезно?

Решение

Во-первых, вы не распаковываете тип.Анонимные типы — это ссылочные типы, а не структуры.

Несмотря на то, что технически вы можете создавать экземпляры одного и того же типа вне метода, в котором они были объявлены (согласно разделу 7.5.10.6 спецификации языка C# 3.0, в котором говорится:

В рамках одной и той же программы два анонимных инициализатора объекта, которые указывают последовательность свойств одинаковых имен и типов времени компиляции в одном и том же порядке, будут создавать экземпляры того же анонимного типа.

) у вас нет возможности получить имя того типа, который вам нужен для того, чтобы выполнить приведение из Object вернитесь к типу, который вы создали.Вам придется прибегнуть к типовое решение что изначально ошибочно.

Приведение по примеру является ошибочным, поскольку с точки зрения проектирования в каждом отдельном месте, где вы хотите получить доступ к типу вне объявленной функции (и все еще внутри того же модуля), вам приходится фактически объявлять тип заново.

Это дублирование усилий, которое приводит к небрежному проектированию и реализации.

Если вы используете .NET 4.0, то вы мог поместите экземпляр объекта в динамическую переменную.Однако основным недостатком является отсутствие проверки доступа к членам во время компиляции.Вы можете легко написать имя члена с ошибкой, и тогда вместо ошибки времени компиляции возникнет ошибка времени выполнения.

В конечном счете, если вы обнаружите необходимость использовать анонимный тип вне метода, в котором он объявлен, то единственное хорошее решение — создать конкретный тип и замените анонимный тип конкретным типом.

Другие советы

Есть несколько способов.

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

Во-первых, вы можете использовать Reflection, на что уже указывал другой ответ.

Другой способ, который заставляет .NET предоставить вам правильный тип, известен как «приведение по примеру», и он выглядит примерно так:Вам необходимо передать объект через вызов универсального метода, который вернет объект как правильный тип, определяя правильный тип для возврата.

Например, попробуйте следующее:

private static T CastByExample<T>(T example, object value)
{
    return (T)value;
}

и использовать его:

var x = CastByExample(new { TheDay = ??, EntranceOrExit = ?? }, obj);

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

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

Однако к этому моменту вы уже должны создать именованный тип.

Анонимный тип имеет область действия метода.Чтобы передать анонимный тип или коллекцию, содержащую анонимные типы, за пределы метода, необходимо сначала привести тип к объекту.Однако это противоречит строгой типизации анонимного типа.Если вам необходимо сохранить результаты запроса или передать их за пределы метода, рассмотрите возможность использования обычной именованной структуры или класса вместо анонимного типа.

Источник: http://msdn.microsoft.com/en-us/library/bb397696.aspx

Нет, ты не можешь.Доступ к свойствам можно получить только с помощью отражения.Компилятор не имеет возможности узнать, что это за тип, и, поскольку это анонимный тип, вы также не можете его привести.

Если вы используете .NET 1.x–3.x, вам необходимо использовать отражение.

Если вы используете .NET 4.0, вы можете использовать динамический тип и вызывать ожидаемые свойства.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top