2012-01-02 5 views
1

Я должен позвонить ChannelFactory<TChannel> класс. Но код ниже для ChannelFactory Класс. Я не знаю, как позвонить ChannelFactory<TChannel>. Пожалуйста, предложите, как я мог бы назвать класс ChannelFactory<TChannel>.Как я могу назвать ChannelFactory <TChannel> динамически?

string interfaceName = "Test"; 
Type myInterfaceType = Type.GetType(interfaceName); 
var factoryType = typeof(ChannelFactory<>).MakeGenericType(myInterfaceType); 
var factoryCtr = factoryType.GetConstructor(new[] { typeof(BasicHttpBinding), typeof(EndpointAddress) }); 
ChannelFactory factorry = factoryCtr.Invoke(new object[] { new BasicHttpBinding(), new EndpointAddress(cmbpath.SelectedItem.ToString()) }) as ChannelFactory; 

ответ

2

Попробуйте следующий код в консольном приложении:

using System; 
using System.ServiceModel; 

namespace ExperimentConsoleApp 
{ 
    class Program 
    { 
     static void Main() 
     { 
      string endPoint = "http://localhost/service.svc"; 

      string interfaceName = "ExperimentConsoleApp.ITest"; 
      Type myInterfaceType = Type.GetType(interfaceName); 
      var factoryType = typeof(ChannelFactory<>).MakeGenericType(myInterfaceType); 
      ChannelFactory factory = Activator.CreateInstance(factoryType, new object[] { new BasicHttpBinding(), new EndpointAddress(endPoint) }) as ChannelFactory; 
     } 
    } 

    [ServiceContract] 
    public interface ITest 
    { } 
} 

Нескольких пунктов:

  • Использование Activator.CreateInstance для создания типа корыто отражения
  • Вы должны полностью квалифицировать ваш интерфейсName, чтобы убедиться, что отражение может найти его
  • Украсьте свое обслуживание в terface с ServiceContract
  • Убедитесь, что конечная точка находится в допустимом формате
2

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

Как ваш код, так и код Wouter хороши в динамическом создании объекта ChannelFactory через Reflection, проблема в том, что, поскольку тип неизвестен во время компиляции, вы не можете его отличить, и все, что вы можете получить, это не общий (не полезно) ChannelFactory.

Итак, чтобы создать свой конкретный канал, а затем вызвать методы на нем, вы можете пройти длинный путь, используя Reflection снова самостоятельно ... или позволить самой среде использовать Reflection от вашего имени с помощью динамического. То есть, изменить свою последнюю (или последний Wouter в) строку:

dynamic factory = factoryCtr.Invoke(..... 

или

dynamic factory = Activator.CreateInstance(... 

без необходимости включать «в качестве ChannelFactory» в конце.

, а затем просто использовать:

dynamic channel = factory.CreateChannel(); 
//and now invoke the methods in your Interface 
channel.TestMethod...