如何使用动态和单词的枚举

时间:2015-03-16 20:14:37

标签: c# dynamic enums ms-word

在此功能中,我使用Word加载模板,并将某些单词替换为其他单词。那不重要。如何更改要使用dynamic的功能?特别是,如何在不引用Microsoft.Office.Interop.Word的情况下使用Enums(例如WdReplace.wdReplaceOne)?

public static void CreateSheetByReplacement(String student, List<String> words)
{
    Application WordApp = new Application();
    WordApp.Documents.Add(Environment.CurrentDirectory + "\\SpellingsReplace.dot");
    WordApp.Selection.Find.Execute(FindText: "studentname", Replace: WdReplace.wdReplaceOne, Wrap: WdFindWrap.wdFindContinue, ReplaceWith: student);
    for (int i = 0; i < 80; i++)
    {
        String word = (i < words.Count ? words[i] : "");
        WordApp.Selection.Find.Execute(FindText: "[word" + (i + 1) + "]", Replace: WdReplace.wdReplaceOne, Wrap: WdFindWrap.wdFindContinue, ReplaceWith: word);
    }
    WordApp.Visible = true;
    WordApp = null;
}

我只需要一个如何使用枚举的例子。

1 个答案:

答案 0 :(得分:1)

虽然除了直接使用各自的Integer值之外,没有办法轻松使用具有dynamic后期绑定的枚举,但您可以使用一些反射和ExpandoObject来构建动态查找对象:

public static class DynamicInterop
{
    public static DynamicInterop()
    {
        var enumsDict = new ExpandoObject() as IDictionary<string, Object>;

        // Get all enum types from interop assembly
        var interopEnums = GetInteropAssembly()
            .GetTypes()
            .Where(type =>
                typeof(Enum).IsAssignableFrom(type));

        // For all enum types create a member in the enums dynamic object
        foreach (var type in interopEnums)
        {
            var curEnum = new ExpandoObject() as IDictionary<string, Object>;

            // Get Enum value name and values as KeyValuePairs
            var enumKeyValues = Enum
                .GetNames(type)
                .Zip(Enum.GetValues(type).Cast<Object>(), 
                    (key, value) =>
                        new KeyValuePair<String, Object>(key, value));

            // Create members for every enum value name-value pair
            foreach (var keyValue in enumKeyValues)
            {
                curEnum.Add(keyValue.Key, keyValue.Value);
            }

            enumsDict.Add(type.Name, curEnum);
        }

        DynamicInterop.Enums = enumsDict;
    }

    public static dynamic CreateWordApp()
    {
        throw new NotImplementedException();
    }

    public static dynamic Enums
    {
        get;
        private set;
    }
}

虽然这种方法可能不完全符合您的需求,但它至少会降低传递错误枚举值的可能性。

P.S。:未经过测试,因此可能会出现拼写错误或其他错误。

P.S.1:但是,由于没有Intellisense和其他IDE和编译器协助,后期与dynamic的Interop绑定很容易成为代码中最难维护的部分。