Создайте анонимный объект Отражением в C#

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

struct pixel {
    unsigned char red;   // 0
    unsigned char green; // 1
    unsigned int alpha;  // 4 (gotta skip to an aligned offset)
    unsigned char blue;  // 8 (then skip 9 10 11)
};

// next offset: 12

Архитектура x86 всегда могла извлекать неверные адреса. Тем не менее, он медленнее, и когда несоосность перекрывает две разные строки кэша, тогда он вытесняет две строки кэша, когда выровненный доступ будет вытеснять только один.

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

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

Значения TL; DR: важны.

10
задан Michael Pliskin 22 September 2008 в 13:00
поделиться

6 ответов

Вот иначе, кажется более прямым.

object anon = Activator.CreateInstance(existingObject.GetType());
3
ответ дан 4 December 2019 в 01:32
поделиться

Вы могли бы хотеть изучить ДОЛЛАР. Я, которым havn't, сделанный так сам (все же), но пример использования за ДОЛЛАР (динамические языки), звучит много как то, что Вы пытаетесь сделать.

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

1
ответ дан 4 December 2019 в 01:32
поделиться

Можно использовать Отражение. Испустите для генерации необходимых классов динамично, хотя это довольно противно для кодирования.

Если бы Вы выбираете этот маршрут, я предложил бы загрузить Отражение, Испускают Дополнение Языка для Отражателя.NET, поскольку это позволяет Вам видеть, как существующие классы были бы созданы с помощью Отражения. Испустите, следовательно хороший метод для изучения этого угла платформы.

1
ответ дан 4 December 2019 в 01:32
поделиться

Да, существует. Из памяти:

public static T create<T>(T t)
{
    return Activator.CreateInstance<T>();
}

object anon = create(existingAnonymousType);
3
ответ дан 4 December 2019 в 01:32
поделиться

Используйте отражение, чтобы получить Тип, использовать GetConstructor на типе, использование Вызывают на конструктора.

Править: Благодаря Sklivvz для указания, что я ответил на вопрос, который не задали ;)

Ответ на фактический вопрос: я нашел, что генерация код C# и затем использование CodeDomProvider (но не сам CodeDOM - ужасный) и затем компиляция, которая вниз и отражающиеся типы из этого является самым легким способом сделать 'анонимные' объекты во времени выполнения.

1
ответ дан 4 December 2019 в 01:32
поделиться

Вы могли бы также хотеть взглянуть в класс FormatterServices: запись MSDN на FormatterServices

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

В ответ на комментарий от Michael: Если у Вас нет экземпляра Типа для типа T, можно всегда получать его от typeof (T). Если у Вас есть объект неизвестного типа, можно вызвать GetType () на нем для получения экземпляра Типа.

1
ответ дан 4 December 2019 в 01:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: