Динамически вставить аргумент Enum Type в конструктор класса, ожидающий & lt; TEnum & gt; [Дубликат]

Я использую метод, опубликованный 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

13
задан albertjan 13 June 2012 в 14:01
поделиться

3 ответа

То, что вы ищете, это 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);

Итак, что вы делаете, это получение типа-определения общего шаблона «шаблон», а затем построение специализации типа с использованием среды выполнения, вождения.

26
ответ дан IDisposable 18 August 2018 в 19:59
поделиться

Вы должны посмотреть этот пост от Айенде: 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]);
8
ответ дан Bill 18 August 2018 в 19:59
поделиться

Возникает вопрос: действительно ли вам нужно создать канал с точным типом контракта в вашем конкретном случае?

Поскольку вы выполняете маршрутизацию, есть очень хороший шанс, что вы можете просто справиться с общие формы каналов. Например, если вы маршрутизируете одностороннее сообщение, тогда вы можете создать канал для отправки сообщения следующим образом:

ChannelFactory<IOutputChannel> factory = new ChannelFactory<IOutputChannel>(binding, endpoint);
IOutputChannel channel = factory.CreateChannel();
...
channel.SendMessage(myRawMessage);

Если вам нужно отправить двустороннюю услугу , вместо этого используйте IRequestChannel.

Если вы выполняете маршрутизацию, проще всего просто иметь дело с родовыми формами каналов (с общим договором на весь контракт с внешним сервисом) и просто убедитесь, что сообщение, которое вы отправляете, имеет все правильные заголовки и свойства.

4
ответ дан tomasr 18 August 2018 в 19:59
поделиться
  • 1
    У меня была дилемма, обозначающая «ответ». на мой вопрос. Что касается использования WCF, я смог использовать эту технику, которую вы упомянули, и она работает как шарм (спасибо!). Я выбрал выше, так как он технически отвечает на вопрос, который я задал (даже если это лучший способ). – t3rse 16 September 2008 в 19:49
Другие вопросы по тегам:

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