我在.NET dll中有一组类,我需要在VBA中使用它们。一些memebers被声明为可空的问题,所以我必须为这些类创建一个包装器,我可以在VBA中使用它。大约有20个课程,所以我正在寻找一些工具或技术来使它自动化,任何想法?
并且重新提出问题 - 当我准备好这个包装器时 - 有一些简单的方法可以复制像这样的对象:
For each [class member] of MyClass
MyNewClass([class member])=MyClass([class member])
next
答案 0 :(得分:3)
如果您正在使用VBA,那么您正在使用COM Interop。通常,明确定义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 Interop客户端之前记录异常,并获取在异常传播到COM时丢失的有用堆栈跟踪信息。 E.g。
[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;
}
}
}
答案 1 :(得分:0)
可能适合该问题的方法是使用Microsoft的T4。在CS 2010中可用,我相信在2012年会更好。如果使用2010,请使用免费版的有形T4编辑器。
20听起来不像很多课。也许手动编码可能更快,但是T4提供了一种自动生成API的方法,如果源类发生变化,它将带来红利。