我正在尝试重构一段代码并且用尽了我能想到的选项。
这是我的原始代码:
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() 约束,然后执行“new TSubInterface()”:这会导致构建错误:“..必须是具有公共无参数构造函数的非抽象类型才能将其用作参数 'TSubInterface ' 在泛型类型或方法中.."
当我使用 Activator.CreateInstance 时,我得到一个运行时异常:“无法创建接口的实例”
当我使用 Activator.CreateComInstanceFrom("someAssemblyName", "typeName") 时,出现编译错误:“无法将表达式类型 'System.Runtime.Remoting.ObjectHandle' 转换为返回类型 TInterface”
[编辑]我可以通过添加 'where TSubInterface : 类来进行编译,但我不确定这是否有意义,因为 TSubInterface 是一个接口。
使用 CreateComInstanceFrom 也不起作用,因为它试图找到在该 dll 不存在且不应该存在的目录中指定的程序集。
我可以以某种方式编译并运行它吗?