Я бы использовал общий, который вы могли бы обрабатывать внешним ...
/// <summary>
/// Generic object copy of the same type
/// </summary>
/// <typeparam name="T">The type of object to copy</typeparam>
/// <param name="ObjectSource">The source object to copy</param>
public T CopyObject<T>(T ObjectSource)
{
T NewObject = System.Activator.CreateInstance<T>();
foreach (PropertyInfo p in ObjectSource.GetType().GetProperties())
NewObject.GetType().GetProperty(p.Name).SetValue(NewObject, p.GetValue(ObjectSource, null), null);
return NewObject;
}
То, что вам нужно, известно как обнаружение браузера:
if ($.browser.mozilla) { ...
Однако сканирование браузера не рекомендуется, так как его легко обмануть пользовательский агент, т. Е. Притвориться быть другим браузером!
Лучше всего использовать обнаружение функций либо по-своему, либо через интерфейс jQuery.support
: http://api.jquery.com/jQuery.support/
Вот статья о расширении его для вашего собственного использования: http://www.waytoocrowded.com/2009/03/14/jquery-supportminheight/
Изменить:
Нашел это сообщение, которое также помогает: Когда IE8 не IE8, что такое $ .browser.version?
typeof InstallTrigger !== 'undefined'
Это просто и работает много позже Quantum, но не уверенное, будет ли это соответствовать требованиям завтрашнего дня хотя: https://developer.mozilla.org/en-US/docs/Web/API/InstallTrigger
navigator.sayswho= (function(){
var N= navigator.appName, ua= navigator.userAgent, tem;
var M= ua.match(/(opera|chrome|safari|firefox|msie)\/?\s*(\.?\d+(\.\d+)*)/i);
if(M && (tem= ua.match(/version\/([\.\d]+)/i))!= null) M[2]= tem[1];
M= M? [M[1], M[2]]: [N, navigator.appVersion,'-?'];
return M.join(' ');
})();
как следует из названия, это то, о чем браузер говорит , это - , но используйте обнаружение объектов, прежде чем запрашивать их на самом деле. ..
Я использую его для регистрации ошибок от пользователей и для тестирования кода в нескольких браузерах, где мне известны строки userAgent.
Лучше определять нужные вам функции, а не браузер. Например, если вам нужно узнать, поддерживается ли foo (), вы можете проверить это с помощью if (foo) {}
Если вам не нужно, чтобы последовательность хранилась в порядке, но только появляются , чтобы быть в порядке, то используйте вещь, называемую «веревкой». (Он состоит из множества «струн», см.)
Я полагаю, что это в основном вектор (в терминах C, массив) struct {char * begin; char * end};
В C++ реализует все функции std:: последовательность. В C необходимо записать (или получить библиотеку) замещающих функций для всех функций strxxx ().
То, что «веревка» могла бы сделать, чтобы добавить последовательности к другому ряду, это просто вставить новое начало, конец пары, указывая на новый кусок последовательности. Возможно, придется скопировать новый фрагмент последовательности, если это временный указатель. Или он может просто стать владельцем последовательности, если это выделенный ряд.
Веревка очень хороша для больших последовательностей. Но все, что меньше 8 КБ, быстрее обрабатывать с помощью memmove и memcpy.
-121--1339985-Большинство ответов здесь правильные (он обрабатывается компилятором, + преобразуется в .append ()...)
Я хотел добавить, что все должны взглянуть на исходный код для последовательность и добавить в какой-то момент, это довольно впечатляет.
Я верю, что дело дошло до чего-то вроде:
"a"+"b"+"c"
=
new String().append("a").append("b").append("c")
Но потом происходит какая-то магия. Это означает:
Тогда как большинство людей считают, что она создаст «ab», затем выбрасывают ее, когда она создает «abc». Он на самом деле понимает, что он скован и делает некоторые манипуляции.
Есть также хитрость, где, если у вас есть последовательность «abc» и вы запрашиваете подстроку, которая оказывается «bc», они МОГУТ использовать один и тот же базовый массив. Вы заметите, что есть начальная позиция, конечная позиция и «общий» флаг.
На самом деле, если он не является общим, он может увеличить длину последовательности и скопировать другие в.
Теперь я просто запутался. Прочитайте исходный код - это довольно круто.
-121--3791923-Как уже спрашивалось в комментарии: зачем вам это? Обнюхивание браузера - вредная привычка, и есть лишь несколько ситуаций, когда это необходимо.
Вместо этого используйте функцию обнаружения. Как описал Николас Закас , вы должны проверить относительно «необычные» функции перед их использованием и полагаться только на эти тесты, поэтому вы своего рода отказоустойчивы. Например, do
if (window.XMLHttpRequest)
var xhr = new XMLHttpRequest();
вместо
if ((brwsr.IE && brwsr.IE.version >= 7) || (brwsr.firefox) || (brwsr.opera))
var xhr = new XMLHttpRequest();
И также don 't do
if (window.XMLHttpRequest)
// Hey, native XMLHttpRequest-support, so position: fixed is also supported
(вместо этого проверьте, поддерживается ли позиция: fixed
)
Существует несколько необычных браузеров с именами, такими как Kazehakase и Midori , которые также могут поддерживать или не поддерживать эти функции, поэтому ваши скрипты потеряете
Но, пожалуйста, прочитайте упомянутую статью , поскольку она содержит очень хорошее и подробное объяснение этого метода. (Кстати, я думаю, что Zakas ' Professional JavaScript for Web Developers до сих пор слишком неизвестен.)
http://api.jquery.com/jQuery.browser/
if ($.browser.mozilla) { ...
Вот так: Проверьте Firefox. Или какой-нибудь другой браузер.
window.onload = function() {
// alert(navigator.userAgent);
if (navigator.userAgent.indexOf("Firefox") > 0) {
alert("ff");
}
}
Для этого вы можете использовать navigator.userAgent
. Просто посмотрите, содержит ли он Mozilla
Вы можете сделать управление с помощью объекта javascript navigator.userAgent
или navigator
в целом,
Но если вы хотите использовать что-то готовое, проверьте это:
http://www.quirksmode.org/js/detect.html
надеюсь, это поможет, Синан.