Создание экземпляров объекта быстрее, чем отражение в Windows CE - PullRequest
7 голосов
/ 01 марта 2011

Итак, после просмотра статьи, описывающей, как Создать экземпляры объекта быстрее, чем отражение Я был очень взволнован, так как в моем коде у меня в настоящее время немало размышлений.К сожалению, DynamicMethod и ILGenerator не поддерживаются в Windows CE. EDIT : Activator поддерживается в Windows CE

Мне было интересно, знает ли кто-нибудь какой-либо способ создания экземпляров объекта быстрее, чем отражение в CE.Если нет, то, возможно, кто-то может объяснить, почему Windows CE не поддерживает эту функцию, и есть ли какие-либо обходные пути для получения этой функции в CE.Даже если бы мне пришлось писать свои собственные классы DynamicMethod и ILGenerator, это могло бы стоить:)

Ответы [ 2 ]

2 голосов
/ 01 марта 2011

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

Тем не менее, это не самая быстрая вещь на планете, особенно если вы намереваетесь создать более одного экземпляра данного типа. То, что я сделал в OpenNETCF.IoC Framework после многих испытаний различных способов создания объекта, заключалось в кэшировании ConstructorInfo для каждого типа (в частности, в классе ObjectFactory ) и использовал это для создания объекта. Да, вы должны использовать рефлексию, чтобы получить CI в первый раз, но последующие вызовы очень быстрые, так как у вас уже есть делегат.

1 голос
/ 01 марта 2011

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

Например:

static class Factory<T> {
    public Func<T> Creator { get; set; }
}

var instance = Factory<TSomething>.Creator();

//Elsewhere
Factory<SomeClass>.Creator = () => new SomeClass();

Это поможет, только если вы можете заранее заполнить фабрику соответствующими типами.


Если все, что у вас есть, это Type (в отличие от универсального параметра), вы можете хранить делегаты в Dictionary<Type, Func<object>>, хотя это будет менее эффективно из-за приведения.
Вам все равно нужно будет заполнить словарь.

...