如果我的类实现了
如果我将接口更改为
脚本执行时会出现错误:
这是真的吗? 是否有可能告诉编译器应该将
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();
}
脚本执行时会出现错误:
我的理解是,公共的对象不支持此属性或方法
GetEnumerator()
方法未被导出,因为它是一个泛型方法,而 IEnumerable.GetEnumerator
也未被导出,因为必须先将实例转换为 IEnumerable
,但在 VBScript 中无法转换对象。这是真的吗? 是否有可能告诉编译器应该将
IEnumerable.GetEnumerator
导出为 public IEnumerable GetEnumerator
?(或者这个说法没有意义?等等)
Mapper.ToEnum
移动到了我的类中,并将其重命名为IEnumerable.GetEnumerator()
。现在,正如您所解释的那样,IEnumerable.GetEnumerator()
无法被调用。因此,我问道:是否可以使GetEnumerator()
(或新创建的某些东西)从COM中可调用。对于我理解缓慢,我深感抱歉,并感谢您迄今为止提供的解释! - Micha Wiedenmann