Как будто вы пытаетесь получить доступ к объекту, который является null
. Рассмотрим ниже пример:
TypeA objA;
. В это время вы только что объявили этот объект, но не инициализировали или не инициализировали. И всякий раз, когда вы пытаетесь получить доступ к каким-либо свойствам или методам в нем, он будет генерировать NullPointerException
, что имеет смысл.
См. Также этот пример:
String a = null;
System.out.println(a.toString()); // NullPointerException will be thrown
То, что Вы ищете, является 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);
Поэтому, что Вы делаете, получает определение типа универсального "шаблонного" класса, затем создавая специализацию типа с помощью управляющих временем выполнения типов.
Необходимо посмотреть на это сообщение от 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]);
Вот вопрос: Вы действительно потребность создать канал с точным контрактом вводят в Вашем конкретном случае?
, Так как Вы делаете маршрутизацию, существует очень хороший шанс, Вы могли просто иметь дело с универсальными формами канала. Например, если Вы направляете одностороннее, только обмениваются сообщениями, затем Вы могли бы создать канал для отсылки сообщения как это:
ChannelFactory<IOutputChannel> factory = new ChannelFactory<IOutputChannel>(binding, endpoint);
IOutputChannel channel = factory.CreateChannel();
...
channel.SendMessage(myRawMessage);
, Если необходимо было отправить в двухстороннюю службу, просто используйте IRequestChannel вместо этого.
при выполнении маршрутизации, в целом, намного легче просто иметь дело с универсальными формами канала (с универсальным всеобъемлющим контрактом на обслуживание к внешней стороне) и просто удостовериться сообщение, которое Вы отправляете, имеет все правильные заголовки и свойства.