Я пытаюсь создать службу WCF, не зная ее типа/интерфейса во время выполнения. Для этого я использую ChannelFactory. ChannelFactory — это универсальный класс, поэтому мне нужно использовать Type.MakeGenericType. Тип, который я передаю в MakeGenericType, берется из списка интерфейсов, который я ранее собрал с помощью отражения путем поиска в некоторых сборках.
В конце концов, я вызываю MethodInfo.Invoke для создания объекта. Объект создается просто отлично, но я не могу привести его к нужному интерфейсу. При кастинге я получаю следующую ошибку:
"Невозможно преобразовать прозрачный прокси в тип Tssc.Services.MyType.IMyType"
После некоторых экспериментов я обнаружил, что проблема заключается в интерфейсе/типе, переданном в MakeGenericType. Если я подставлю интерфейс в своем списке на фактический интерфейс, то все работает нормально. Я прочесал два объекта и не вижу разницы. Когда я изменяю код для создания обоих типов, сравнение их с Equals возвращает false. Мне неясно, просто ли Equals проверяет, что они ссылаются на один и тот же объект (нет), или они проверяют все свойства и т. д.
Может ли это быть как-то связано с тем, как я собрал свои интерфейсы (отражение, сохранение в списке...)? Сравнение объектов, кажется, указывает на то, что они эквивалентны. Я напечатал все свойства для обоих объектов, и они одинаковы. Нужно ли копать глубже? Если да, то куда?
// createService() method
//*** tried both of these interfaces, only 2nd works - but they seem to be identical
//Type t = interfaces[i]; // get type from list created above - doesn't work
Type t = typeof(Tssc.Services.MyType.IMyType); // actual type - works OK
// create ChannelFactory type with my type parameter (t)
Type factoryType = typeof(ChannelFactory<>);
factoryType = factoryType.MakeGenericType(new Type[] { t });
// create ChannelFactory<> object with two-param ctor
BasicHttpBinding binding = new BasicHttpBinding();
string address = "blah blah blah";
var factory = Activator.CreateInstance(factoryType, new object[] { binding, address });
// get overload of ChannelFactory<>.CreateChannel with no parameters
MethodInfo method = factoryType.GetMethod("CreateChannel", new Type[] { });
return method.Invoke(factory, null);
//--------------- code that calls code above and uses its return
object ob = createService();
//*** this cast fails
Tssc.Services.MyType.IMyType service = (Tssc.Services.MyType.IMyType)ob;