如果您使用 VBA,则您使用的是 COM 互操作。一般来说,明确定义 COM 接口被认为是一种很好的做法,即:
[ComVisible]
public class MyClass
{
...
}
你应该使用:
[ComVisible]
public interface IMyClass
{
...
}
[ComVisible]
[ClassInterface(ClassInterfaceType.None)]
public class MyClass : IMyClass
{
...
}
一旦你这样做了,就很容易了:你只需要在IMyClass
接口中避免可以为空的类型,并显式地实现它,例如:
[ComVisible]
public interface IMyClass
{
...
public int MyInt {get; }
}
[ComVisible]
[ClassInterface(ClassInterfaceType.None)]
public class MyClass : IMyClass
{
...
public int? MyInt {get; }
int IMyClass.MyInt
{
get { return this.MyInt ?? 0; }
}
}
顺便说一句,以这种方式使用显式接口实现的另一个好处是,您可以在传播到 COM 互操作客户端之前记录异常,并获取有用的堆栈跟踪信息,这些信息在异常传播到 COM 时会丢失。例如
[ComVisible]
public interface IMyClass
{
...
public void MyMethod();
}
[ComVisible]
[ClassInterface(ClassInterfaceType.None)]
public class MyClass : IMyClass
{
...
public void MyMethod()
{
}
void IMyClass.MyMethod()
{
try
{
this.MyMethod();
}
catch(Exception ex)
{
... log exception ex here ...
throw;
}
}
}