在此功能中,我使用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;
}
我只需要一个如何使用枚举的例子。
答案 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绑定很容易成为代码中最难维护的部分。