gpt4 book ai didi

c# - 使用显式接口(interface)实现时如何选择将哪个成员导出到COM?

转载 作者:行者123 更新时间:2023-11-30 16:52:00 24 4
gpt4 key购买 nike

如果我的类实现了IEnumerable , 我可以使用 VBScript 的 For Each循环:

[ComVisible(true)]
[ProgId("Stackoverflow.MyIssues")]
[Guid("7D392CB1-9080-49D0-B9CE-05B214B2C448")]
public class MyIssue : IEnumerable
{
readonly List<string> issues = new List<string>(new string[] { "foo", "bar" });

public string this[int index]
{
get { return issues[index]; }
}

public IEnumerator GetEnumerator()
{
return issues.GetEnumerator();
}
}


Dim o : Set o = CreateObject("Stackoverflow.MyIssues")

Dim i
For Each i In o
WScript.Echo i
Next

如果我将界面更改为 IEnumerable<string> (所以 C# 的 foreach 循环使用 string 而不是 object ):

public class MyIssue : IEnumerable<string>

并替换GetEnumerator与:

public IEnumerator<string> GetEnumerator()
{
return issues.GetEnumerator();
}

IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}

脚本将因错误而失败:

Object Doesn't Support this Property or Method

我的理解是大众GetEnumerator()不导出,因为它是一个通用方法,IEnumerable.GetEnumerator不导出,因为我的实例必须首先转换为 IEnumerable但在 VBScript 中不能转换对象。

这是真的吗?是否可以告诉编译器 IEnumerable.GetEnumerator应该导出为 public IEnumerable GetEnumerator ? (或者这个声明没有感觉?等等)

最佳答案

切换哪个接口(interface)是显式实现的,比如:

IEnumerator<string> IEnumerable<string>.GetEnumerator()
{
// ...
}

public IEnumerator GetEnumerator()
{
// ...
}

这是因为IEnumerable.GetEnumerator has the DispId(-4) attribute ,这是 VBScript 通过 IDispatch.Invoke 使用的内容。

泛型方法和具有泛型类型的方法是 COM 不可见的,因此如果您不想更改代码,请为 COM 定义一个额外的方法:

// Test if the .NET framework dispatches the method if you apply the following attribute
//[ComVisible(false)]
[DispId(-4)]
public IEnumerator NewEnum()
{
return ((IEnumerable)this).GetEnumerator();
}

关于c# - 使用显式接口(interface)实现时如何选择将哪个成员导出到COM?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33168674/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com