Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 我可以继承一个类来为泛型提供com互操作吗?_.net_Vb.net_Com Interop - Fatal编程技术网

.net 我可以继承一个类来为泛型提供com互操作吗?

.net 我可以继承一个类来为泛型提供com互操作吗?,.net,vb.net,com-interop,.net,Vb.net,Com Interop,我有一个类,它包含许多公共xxx as List(someType)。这在我们的代码中被广泛使用。不幸的是,我还需要将这些列表作为ArrayList提供,因为我们需要在VBA(特别是Excel)中访问相同的对象 我熟悉abstract和override/new,但这意味着要修改大量已经实现的代码,在我看来,还要创建大量额外的代码(可能有50种)来抽象出对象,而事实上99%的时间都是这样 这是基本问题 public class cProp private Eyes as List(Of I

我有一个类,它包含许多公共xxx as List(someType)。这在我们的代码中被广泛使用。不幸的是,我还需要将这些列表作为ArrayList提供,因为我们需要在VBA(特别是Excel)中访问相同的对象

我熟悉abstract和override/new,但这意味着要修改大量已经实现的代码,在我看来,还要创建大量额外的代码(可能有50种)来抽象出对象,而事实上99%的时间都是这样

这是基本问题

public class cProp
    private Eyes as List(Of Integer)
    public property Eyes as List(Of Integer)
        'get and set that does a lot of work
    end property
    'repeat 50 times
end class
我们几乎所有的代码都使用cProp,因此编写一个50项的抽象基类,而这个基类中没有任何其他内容,看起来它除了引入bug之外什么也不做。所以理想情况下我想要一些像

<ClassInterface(ClassInterfaceType.AutoDual)>
public class dProp
    inherits cProp
    public readonly property **something** Eyes as ArrayList
        'convert List to ArrayList
    end property
end class

公共类dProp
继承cProp
公共只读属性**某物**视为ArrayList
'将列表转换为ArrayList
端属性
末级

如果存在这样的事情,我还没有弄明白。

那是不可能的。COM不支持泛型,对泛型接口或类的调用(直接或间接)将导致
E_NOINTERFACE
错误。定义互操作性类型时,您可以而不是执行的操作:

  • 从COM访问通用接口
  • 访问派生自泛型类的非泛型类的类接口
  • 为泛型类生成类接口。例如,无法为
    Foo
    类生成
    \u FooBar
    接口

虽然.NET实现可能使用泛型类型,但您只能向COM公开非泛型版本。如果将
IEnumerable
IList
公开给COM,则让您的类接口继承自(或将其用作属性类型)。此接口与COM兼容,通用版本实现了它,因此您可以在.NET端保持类型安全性,并使用COM的非通用版本。

简单地添加一堆单独的只读属性(例如数组等)的缺点是什么?这些属性将现有的道具作为ArrayList提供?永远不要公开实现,COM客户端只使用接口。在本例中为System.Collections.IList。查找它的实现很简单,List实现了它。@tolanj,我可以有两个只在返回类型上不同的属性吗?我认为它们在参数上必须是多边形的,特别是在COM中,编译器不知道返回类型?@hans hello你能说得更具体些吗?我不确定我是否明白你在说什么。你们似乎在说这个列表会起作用,但这样的定义在COM中是看不见的。我是否应该公开一个使用“As-IList”的版本?请将其详细说明为System.Collections.IList。并简单地返回List对象。你唯一能做的错事就是不要尝试。谢谢你。我显然有很多关于界面的阅读!