Динамично Создайте универсальный тип для шаблона

Как будто вы пытаетесь получить доступ к объекту, который является null. Рассмотрим ниже пример:

TypeA objA;

. В это время вы только что объявили этот объект, но не инициализировали или не инициализировали. И всякий раз, когда вы пытаетесь получить доступ к каким-либо свойствам или методам в нем, он будет генерировать NullPointerException, что имеет смысл.

См. Также этот пример:

String a = null;
System.out.println(a.toString()); // NullPointerException will be thrown
14
задан albertjan 13 June 2012 в 13: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);

Поэтому, что Вы делаете, получает определение типа универсального "шаблонного" класса, затем создавая специализацию типа с помощью управляющих временем выполнения типов.

29
ответ дан 1 December 2019 в 06:54
поделиться

Необходимо посмотреть на это сообщение от Ayende: WCF, Насмешка и МОК: О, МОЙ! . Где-нибудь около нижней части метод под названием 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
ответ дан 1 December 2019 в 06:54
поделиться

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

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

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

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

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

4
ответ дан 1 December 2019 в 06:54
поделиться
Другие вопросы по тегам:

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