Примечание : следующее является в наше время в основном устаревшим благодаря строгому режиму, и 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 …
})();
Существует метод FormatterServices.GetUninitializedObject (пространство имен: System.Runtime.Serialization), он предположительно не вызывает конструкторов, если вы действительно хотите опробовать этот подход.
Альтернативой было бы назначить вызывающую сборку как «дружественную» сборку .
Просто добавьте это в файл AssemblyInfo.cs сборки, содержащей внутренний конструктор:
[assembly: InternalsVisibleTo("Calling.Assembly")]
Если у вас нет доступа к сборке, вы также можете вызвать конструктор напрямую (используя Reflection):
MyClass obj = (MyClass) typeof(MyClass).GetConstructor(
BindingFlags.NonPublic | BindingFlags.Instance,
null, Type.EmptyTypes, null).Invoke(null);
внутренний
не означает, что вы не можете создать его экземпляр. Это просто означает, что его могут вызывать только члены из одной сборки.
В целях тестирования вы также можете разрешить своей тестовой сборке доступ к внутренним компонентам, используя атрибут InternalsVisibleTo. См. http://msdn.microsoft.com/en-us/library/system.runtime.compilerservices.internalsvisibletoattribute. aspx
Некоторое время назад я испытал ту же ситуацию и создал небольшую утилиту, которую назвал «InternalsVisibleToInjector». Он использует ILDASM и ILASM для дизассемблирования, изменения, повторной сборки и сборки с добавлением имени сборки по моему выбору в список InternalsVisibleTo для целевой сборки. В моей ситуации это сработало достаточно хорошо.
Я разместил исходный код (VS 2008 C # WinForm) для утилиты здесь:
http://www.schematrix.com/downloads/InternalsVisibleToInjector.zip
Это может не работать, если сборка подписана. Пожалуйста, примите все необходимые меры предосторожности (например, сделайте резервную копию сборки перед ее использованием и убедитесь, что у вас есть веские юридические основания и т. Д.)
Вы можете использовать Reflector , чтобы проанализировать его исходный код и, исходя из этого, выяснить его внутреннюю работу.