Инстанцирование класса с внутренним конструктором

Примечание : следующее является в наше время в основном устаревшим благодаря строгому режиму, и hasOwnProperty. Правильное решение должно использовать строгий режим и проверять на присутствие свойства с помощью obj.hasOwnProperty. Этот ответ предшествует обе этих вещи, по крайней мере, как широко реализовано (да, это настолько старо). Возьмите следующее в качестве исторического очерка.

<час>

Принимают во внимание, что undefined (к сожалению) не зарезервированное слово в JavaScript если you’re, не используя строгий режим. Поэтому у кого-то (кто-то еще, очевидно) могла быть главная идея переопределить его, повреждая Ваш код.

А больше устойчивого метода является поэтому следующим:

if (typeof(x.attribute) !== 'undefined')

На обороте, этот метод является намного более подробным и также медленнее.:-/

А, общая альтернатива должна гарантировать, что undefined на самом деле не определены, например, путем помещения кода в функцию, которая принимает дополнительный параметр, названный undefined, это isn’t, передал значение. Чтобы гарантировать, что it’s не передал значение, Вы могли просто назвать его сами сразу, например:

(function (undefined) {
    … your code …
    if (x.attribute !== undefined)
        … mode code …
})();
47
задан Michael Stum 29 July 2009 в 11:41
поделиться

5 ответов

Существует метод FormatterServices.GetUninitializedObject (пространство имен: System.Runtime.Serialization), он предположительно не вызывает конструкторов, если вы действительно хотите опробовать этот подход.

32
ответ дан 26 November 2019 в 19:15
поделиться

Альтернативой было бы назначить вызывающую сборку как «дружественную» сборку .

Просто добавьте это в файл AssemblyInfo.cs сборки, содержащей внутренний конструктор:

[assembly: InternalsVisibleTo("Calling.Assembly")]

Если у вас нет доступа к сборке, вы также можете вызвать конструктор напрямую (используя Reflection):

MyClass obj = (MyClass) typeof(MyClass).GetConstructor(
                  BindingFlags.NonPublic | BindingFlags.Instance,
                  null, Type.EmptyTypes, null).Invoke(null);
85
ответ дан 26 November 2019 в 19:15
поделиться

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

В целях тестирования вы также можете разрешить своей тестовой сборке доступ к внутренним компонентам, используя атрибут InternalsVisibleTo. См. http://msdn.microsoft.com/en-us/library/system.runtime.compilerservices.internalsvisibletoattribute. aspx

0
ответ дан 26 November 2019 в 19:15
поделиться

Некоторое время назад я испытал ту же ситуацию и создал небольшую утилиту, которую назвал «InternalsVisibleToInjector». Он использует ILDASM и ILASM для дизассемблирования, изменения, повторной сборки и сборки с добавлением имени сборки по моему выбору в список InternalsVisibleTo для целевой сборки. В моей ситуации это сработало достаточно хорошо.

Я разместил исходный код (VS 2008 C # WinForm) для утилиты здесь:

http://www.schematrix.com/downloads/InternalsVisibleToInjector.zip

Это может не работать, если сборка подписана. Пожалуйста, примите все необходимые меры предосторожности (например, сделайте резервную копию сборки перед ее использованием и убедитесь, что у вас есть веские юридические основания и т. Д.)

3
ответ дан 26 November 2019 в 19:15
поделиться

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

1
ответ дан 26 November 2019 в 19:15
поделиться
Другие вопросы по тегам:

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