Я использую метод, опубликованный Brock Adams, и он даже работает в Firefox, если он инициирован пользователем.
open(location, '_self').close();
Я вызываю его нажатием на кнопку, поэтому он инициируется пользователем, и это все еще работает отлично, используя Chrome 35-40, Internet Explorer 11, Safari 7-8 и ALSO Firefox 29-35. Я тестировал версию 8.1 Windows и Mac OS X 10.6, 10.9 и amp; 10.10 если это другое.
Полный код:
HTML:
JavaScript:
function quitBox(cmd)
{
if (cmd=='quit')
{
open(location, '_self').close();
}
return false;
}
Попробуйте следующую тестовую страницу: (Теперь протестировано в Chrome 40 и Firefox 35)
http://browserstrangeness.bitbucket.io/window_close_tester.htm
То, что вы ищете, это MakeGenericType
string elementTypeName = Console.ReadLine();
Type elementType = Type.GetType(elementTypeName);
Type[] types = new Type[] { elementType };
Type listType = typeof(List<>);
Type genericType = listType.MakeGenericType(types);
IProxy proxy = (IProxy)Activator.CreateInstance(genericType);
Итак, что вы делаете, это получение типа-определения общего шаблона «шаблон», а затем построение специализации типа с использованием среды выполнения, вождения.
Вы должны посмотреть этот пост от Айенде: WCF, Mocking и IoC: Oh MY! . Где-то рядом с дном находится метод GetCreationDelegate, который должен помочь. В основном это делает:
string typeName = ...;
Type proxyType = Type.GetType(typeName);
Type type = typeof (ChannelFactory<>).MakeGenericType(proxyType);
object target = Activator.CreateInstance(type);
MethodInfo methodInfo = type.GetMethod("CreateChannel", new Type[] {});
return methodInfo.Invoke(target, new object[0]);
Возникает вопрос: действительно ли вам нужно создать канал с точным типом контракта в вашем конкретном случае?
Поскольку вы выполняете маршрутизацию, есть очень хороший шанс, что вы можете просто справиться с общие формы каналов. Например, если вы маршрутизируете одностороннее сообщение, тогда вы можете создать канал для отправки сообщения следующим образом:
ChannelFactory<IOutputChannel> factory = new ChannelFactory<IOutputChannel>(binding, endpoint);
IOutputChannel channel = factory.CreateChannel();
...
channel.SendMessage(myRawMessage);
Если вам нужно отправить двустороннюю услугу , вместо этого используйте IRequestChannel.
Если вы выполняете маршрутизацию, проще всего просто иметь дело с родовыми формами каналов (с общим договором на весь контракт с внешним сервисом) и просто убедитесь, что сообщение, которое вы отправляете, имеет все правильные заголовки и свойства.