C# — хороший способ предоставить Nullable‹T› COM

Мы работаем над предоставлением сборки для COM.

Среди прочего, мы часто используем значения, допускающие значение NULL, такие как 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; }
}

Проблема в том, что нам нужен способ передавать "null" туда и обратно через COM. Использование числа, такого как -1 или 0, не будет работать, потому что это также допустимые значения.

Нам приходится использовать значения NULL, потому что они изначально взяты из нашей схемы базы данных.


person jonathanpeppers    schedule 31.12.2009    source источник
comment
Ты пытался? Поскольку Nullable<T> является структурой?   -  person Cecil Has a Name    schedule 01.01.2010
comment
tbleexp (или Visual Studio, когда вы отметите «Регистрация для COM-взаимодействия») не выдает сообщение о том, что он не может экспортировать универсальные типы.   -  person jonathanpeppers    schedule 02.01.2010


Ответы (1)


Как насчет использования Variant (VT_DATE) на стороне COM? Если вы объявляете член как объект, вы должны иметь возможность передавать DateTime или null, и COM-взаимодействие должно обрабатывать его нормально. См. следующее в MSDN для получения более подробной информации.

Маршалинг объекта в вариант

person Josh    schedule 31.12.2009
comment
Работает ли это долго?, float?, double? мы используем много разных типов, допускающих значение NULL. - person jonathanpeppers; 02.01.2010
comment
Да, все эти типы могут быть представлены как варианты. Ссылка внизу моего ответа должна привести вас прямо к таблице, которая показывает, какие типы вариантов примитивных типов отображаются как варианты. - person Josh; 02.01.2010
comment
Соглашаться. Я не знаю, что находится по ту сторону (клиент) вашего COM-интерфейса, но это лучший вариант. Для многих сред все остальное будет в лучшем случае надуманным, в худшем — вообще не будет работать (например, VBScript). - person Euro Micelli; 04.01.2010
comment
Один быстрый вопрос: в их примере они используют интерфейс MarshalObject, которого нет во фреймворке. Так что мне кажется, что мне нужно просто создать более целевой интерфейс, который обертывает любое значение, допускающее значение NULL, он может иметь методы для HasValue, ToInt(), ToLong() и т. д. - person jonathanpeppers; 04.01.2010
comment
Я думаю, что этот интерфейс просто использовался для демонстрации того, как COM видит управляемый интерфейс с различными сигнатурами разных типов. Из того, что я понял, прочитав документацию, Object маршалируется как VARIANT, если подпись имеет тип System.Object. - person Josh; 04.01.2010
comment
Я понимаю. Я должен просто пометить эти типы как объекты, и они должны появиться как VARIANT на стороне COM-клиента. - person jonathanpeppers; 04.01.2010