【问题标题】:C# - Good way to expose Nullable<T> to COMC# - 向 COM 公开 Nullable<T> 的好方法
【发布时间】:2010-01-01 06:27:33
【问题描述】:

我们正在努力向 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 这样的数字是行不通的,因为它们也是有效值。

我们不得不使用 nullables b/c 这些最初来自我们的数据库架构。

【问题讨论】:

  • 你试过了吗?因为Nullable&lt;T&gt; 是一个结构体?
  • tbleexp(或标记为“注册 COM 互操作”时的 Visual Studio)失败,给出无法导出泛型类型的消息。

标签: c# .net com nullable


【解决方案1】:

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

Marshaling Object to Variant

【讨论】:

  • 这可以长期工作吗?浮动?双倍?我们使用许多不同的可空类型。
  • 是的,这些类型都可以表示为变体。我的答案底部的链接应该将您带到显示原始类型映射为变体的变体类型的表格。
  • 同意。我不知道 COM 接口的另一端(客户端)是什么,但这是最好的选择。对于许多环境来说,其他任何东西充其量都是人为设计的,最坏的情况是根本不起作用(例如 VBScript)。
  • 一个快速的问题:在他们的示例中,他们使用了一个接口 MarshalObject,而该接口似乎不在框架中。所以在我看来,我只需要创建一个更针对目标的接口来包装任何可为空的值,它可以有 HasValue、ToInt()、ToLong() 等方法。
  • 我认为该接口只是用于演示 COM 如何看到具有不同类型的各种签名的托管接口。根据我在阅读文档时收集到的信息,只要签名是 System.Object 类型,Object 就会被编组为 VARIANT。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-06-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多