C# - 将 Nullable<T> 暴露给 COM 的好方法

10

我们正在努力将一个程序集暴露给COM。

除此之外,我们频繁使用可空值类型,例如long?,DateTime?等。这些是泛型类型,无法暴露给COM。

对于这些数据类型,在COM中有什么好的替代品?

我们已经尝试了以下方法:

//Original CustomerID property in class
public long? CustomerID
{
   get;
   set;
}

//Explicit COM interface
long IComInterface.CustomerID
{
  get { return CustomerID.GetValueOrDefault(); }
  set { CustomerID = value; }
}
问题是,我们需要一种通过COM传递“null”的方法。使用像-1或0这样的数字是行不通的,因为这些也是有效的值。
我们必须使用可空类型,因为这些最初来自我们的数据库架构。

你试过了吗?因为Nullable<T>是一个结构体。 - Cecil Has a Name
tblexp(或在“注册COM互操作性”时标记Visual Studio)失败并显示消息,指出它无法导出通用类型。 - jonathanpeppers
1个回答

8
如果在COM端使用Variant(VT_DATE)怎么样?如果您将成员声明为对象,则应该能够传递DateTime或null,而COM互操作应该可以处理它。有关详细信息,请参见MSDN上的以下内容。 将对象编组到变体

这适用于长整型、浮点型和双精度型吗?我们使用许多不可空类型。 - jonathanpeppers
是的,所有这些类型都可以表示为变体。我的答案底部的链接应该会直接带您到表格,显示原始类型映射为变体的类型。 - Josh
同意。我不知道你的COM接口的另一端(客户端)是什么,但这是最好的选择。对于许多环境来说,其他任何选项都会在最好的情况下是牵强附会,在最坏的情况下根本无法工作(例如VBScript)。 - Euro Micelli
一个快速的问题:在他们的示例中,他们使用了一个似乎不在框架中的接口MarshalObject。所以在我看来,这似乎需要创建一个更具有针对性的接口,用于包装任何可空值,它可以具有HasValue、ToInt()、ToLong()等方法。 - jonathanpeppers
我认为该接口只是用来演示COM如何看待具有不同类型签名的托管接口。根据我阅读文档所得,只要签名是System.Object类型,Object就会被编组为VARIANT。 - Josh
我明白了,我只需要将这些类型标记为对象,它们就会在COM客户端侧显示为VARIANT。 - jonathanpeppers

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接