Я попробовал несколько решений, но его единственный, который действительно работал для меня во всех браузерах
let newTab = window.open();
newTab.location.href = url;
Абсолютно можно смешать делегатов с дженериками. В 2,0, Predicate<T>
и т.д. хорошие примеры этого, но у Вас должно быть то же количество args. В этом сценарии возможно, опция состоит в том, чтобы использовать получения для включения args в делегата?
т.е.
public delegate void Action();
static void Main()
{
DoStuff(delegate {Foo(5);});
DoStuff(delegate {Bar("abc","def");});
}
static void DoStuff(Action action)
{
action();
}
static void Foo(int i)
{
Console.WriteLine(i);
}
static void Bar(string s, string t)
{
Console.WriteLine(s+t);
}
Примечание, которое Action
определяется для Вас в.NET 3.5, но можно повторно объявить это в 2,0 целях; Примечание-p
, что анонимный метод (delegate {...}
) может также быть параметризован:
static void Main()
{
DoStuff(delegate (string s) {Foo(5);});
DoStuff(delegate (string s) {Bar(s,"def");});
}
static void DoStuff(Action<string> action)
{
action("abc");
}
static void Foo(int i)
{
Console.WriteLine(i);
}
static void Bar(string s, string t)
{
Console.WriteLine(s+t);
}
Наконец, C# 3.0 делает это все намного легче и более симпатичным с "лямбдами", но это - другая тема;-p
Да, возможно объединить дженерики с делегатами.
public delegate void Action<T>(T x);
public delegate void Action<T,U>(T x, U y);
public void UsingMutex<T>(Action<T> x, T t) {
// acquire mutex...
x(t);
// release mutex...
}
public void UsingMutex<T,U>(Action<T,U> x, T t, U u) {
// acquire mutex...
x(t, u);
// release mutex...
}
, Но все еще необходимо обработать другое количество параметров с помощью перегрузок.
Если Вы посмотрите Func<T>
и Action<T>
делегаты в платформе, то Вы будете видеть, что они определяют много подобных делегатов с другим количеством параметров. Можно использовать дженерики, но это не решает количество проблемы аргументов, о которой Вы говорите.