C#使用Redemption时如何访问RDOFolder的FolderPath等动态属性
问题原因
你遇到的是Redemption库COM互操作的典型特性:RDOFolder的强类型定义仅暴露了部分常用核心属性,其余大量属性未包含在编译时可见的接口定义中,仅通过COM的IDispatch接口提供运行时动态访问能力,因此编译阶段强类型检查会提示属性不存在,只有运行时的Dynamic View可以观测到完整属性列表。
解决方案
方案1:使用dynamic类型跳过编译时类型检查
将RDOFolder对象声明为dynamic,让.NET运行时自动完成动态属性绑定,代码改动最小:
foreach(RDOStore store in rdoSession.Stores) { dynamic folder = store.GetDefaultFolder(rdoDefaultFolders.olFolderInbox); Debug.WriteLine(folder.FolderPath); }
注意:该方式编译阶段不会做属性存在性校验,若属性名拼写错误或属性不存在,会在运行时抛出异常,建议按需添加异常捕获逻辑。
方案2:通过反射调用获取属性
如果你的项目禁止使用dynamic,或者需要兼容更低版本的.NET框架,可以通过反射的方式显式获取动态属性:
foreach(RDOStore store in rdoSession.Stores) { RDOFolder folder = store.GetDefaultFolder(rdoDefaultFolders.olFolderInbox); string folderPath = folder.GetType().InvokeMember( "FolderPath", System.Reflection.BindingFlags.GetProperty, null, folder, null ) as string; Debug.WriteLine(folderPath); }
你也可以封装通用扩展方法简化重复调用:
public static class RedemptionExtension { public static T GetRedemptionProperty<T>(this object comObj, string propertyName) { object result = comObj.GetType().InvokeMember( propertyName, System.Reflection.BindingFlags.GetProperty, null, comObj, null ); return result == null ? default(T) : (T)result; } } // 调用示例 string folderPath = folder.GetRedemptionProperty<string>("FolderPath");
内容的提问来源于stack exchange,提问作者Leigh
相关产品推荐
相关产品推荐

