Я пытаюсь реорганизовать часть кода, и у меня закончились варианты, которые я могу придумать.
Это исходный код, который у меня был:
if (WebConfigSettings.ComPartition == null && HttpContext.Current != null)
Nses = new NSession();
else
Nses = (INSession)Marshal.BindToMoniker(string.Format("partition:{0}/new:NuntioServer.NSession", WebConfigSettings.ComPartition));
И
if (WebConfigSettings.ComPartition == null && HttpContext.Current != null)
apses.Wses = new WSession();
else
apses.Wses = (IWSession)Marshal.BindToMoniker(string.Format("partition:{0}/new:NuntioServer.WSession", WebConfigSettings.ComPartition));
И вот как я пытаюсь его реорганизовать:
(Да, в C# вы можете в интерфейс а>.)
public static TInterface Get<TSubInterface, TInterface>() where TSubInterface: TInterface
{
<snip></snip>
if (!useComPartitions)
return Activator.CreateInstance<TSubInterface>(); // --> this is not cooperating
return (TInterface)Marshal.BindToMoniker(.....);
}
Вот что я уже пробовал:
Я попытался указать ограничение new (), а затем выполнить «новый TSubInterface ()»: это приводит к ошибке сборки: «.. должен быть неабстрактный тип с общедоступным конструктором без параметров, чтобы использовать его в качестве параметра» TSubInterface ' в универсальном типе или методе.."
когда я использую Activator.CreateInstance, я получаю исключение времени выполнения: «Невозможно создать экземпляр интерфейса»
когда я использую Activator.CreateComInstanceFrom("someAssemblyName", "typeName"), я получаю ошибку компиляции: "Не удается преобразовать тип выражения "System.Runtime.Remoting.ObjectHandle" для возврата типа TInterface"
[edit] Я смог выполнить эту компиляцию, добавив 'where TSubInterface : class, но я не уверен, что это имеет смысл, поскольку TSubInterface является интерфейсом.
Использование CreateComInstanceFrom также не имеет смысла' не работает, потому что пытается найти ту сборку, которая указана в каталоге, где этой dll нет и быть не должно.
Могу ли я как-то заставить это скомпилировать и запустить?
Both NSession and INSession are interface
, а у вас ограничениеNSession : INSession
. Действительно ли это два интерфейса, один из которых наследует другой? Если да, то почему имя интерфейса в шаблонеTClass
. - person Zdeslav Vojkovic   schedule 28.09.2012CreateInstance
используют конструкторы указанного типа без поиска класса «псевдоним». Тем не менее, меня интересует предыстория вашего решения сделать это таким образом. Мне кажется это очень плохой идеей. - person Zdeslav Vojkovic   schedule 28.09.2012