繁体   English   中英

从 VBA COM.Interop 访问 C# 类

[英]Access C# classes from VBA COM.Interop

错误:未定义属性让程序和属性获取程序未返回 object vba 以下是相关代码:

namespace Entities
{
    [Guid("E65658F2-67C4-4F86-890C-62517EFB19AC")]
    [ComVisible(true)]
    public interface IFieldTags
    {
        [DispId(-4)]
        FieldTagsEnumerator GetEnumerator();
    }

    [Guid("472DDF54-E42D-4E6D-9D62-1507CDB2ED0A")]
    [ClassInterface(ClassInterfaceType.AutoDispatch)]
    [ComVisible(true)]
    public class FieldTags : IEnumerable, IFieldTags
    {

        private List<FieldTag> fieldTagsList;

        internal FieldTags(Document document, Tools tools)
        {
            this.constants = tools.Constants;
            this.document = document;
            this.fieldTagsList = GetFieldtagList();
        }

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

        public FieldTagsEnumerator GetEnumerator()
        {
            return new FieldTagsEnumerator(this.fieldTagsList);
        }
    }


    public class FieldTagsEnumerator : IEnumerator
    {
        private readonly List<FieldTag> fieldTagsCollection;
        private int position = -1;

        public FieldTagsEnumerator(List<FieldTag> fieldTagsList)
        {
            fieldTagsCollection = fieldTagsList;
        }
    }
}

Generated.tlb 使用 RegAsm.exe 和 Attached Entities.tlb 到 VBA

在 VBA 中:

Dim objFieldTags As Entities.IFieldTags
// returns FieldTags type object in c#
Set objFieldTags = objDocument.GetNewRange(WordDocument.Range).FieldTags

For Each obj In objFieldTags

对于每个导致错误,这种方法是否正确? 如何在循环中使用 FieldTags?

我不是专家,但最近为 VBA 的 C# 字典包装器解决了这个问题。

以下是我如何为 c# 包装的字典管理它。

private Dictionary<dynamic, dynamic> Host = new Dictionary<dynamic, dynamic>();

public IEnumerator GetEnumerator()
    {
        foreach (KeyValuePair<dynamic, dynamic> myPair in Host)
        {
            yield return new KVPair(myPair.Key, myPair.Value);
        }
    }

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

当我将 c# object 包裹在 vba class 中时

// Allows a wrapped Kvp to be enumerated in VBA
public IEnumerator KvpEnum()
{
    foreach (KeyValuePair<dynamic, dynamic> myPair in Host)
    {
        yield return new KVPair(myPair.Key, myPair.Value);
    }
}

我完整的 class 在这里Kvp: C# 库,用于包装字典的 VBA。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM