【问题标题】:Inheritance of a .Net interface in C#: How to access base membersC# 中 .Net 接口的继承:如何访问基成员
【发布时间】:2015-08-24 19:57:42
【问题描述】:

.Net 接口的继承:如何访问基本属性

我想创建我自己的继承自 Microsoft.Office.Interop.Outlook.Category 接口的类别类,但我试图访问基接口的成员但没有成功。

我试过 base.Name 和 this.Name 都给我:

错误 2“对象”不包含“名称”的定义

使用 VS 2013、.Net 4.5

代码:

using System;
using Outlook = Microsoft.Office.Interop.Outlook;

namespace MyCategory
{
        public class MyCategory : Outlook.Category
    {
        private string colorName; 
        public string ColorName
        {
            get
            {
                return this.colorName;
            }
            set
            {
                //Name is a member of Outlook.Category
                //https://msdn.microsoft.com/en-us/library/office/microsoft.office.interop.outlook.category_members.aspx
                this.colorName = base.Name;
                //
            }
        }

    }
}

【问题讨论】:

  • 你不能从接口继承属性...你必须实现接口保证的属性。
  • 我建议处理 Outlook 事件并使用 Outlook 表单区域,而不是继承 Category 接口(这没有任何意义)。请参阅Creating Outlook Form Regions 了解更多信息。

标签: c# .net inheritance outlook-addin


【解决方案1】:

到目前为止,我在您的代码中看到,您没有实现接口。您不是从一个类继承,而是遵循Outlook.Category 接口建立的契约。这里没有“基础”成员,您必须将成员添加到您的班级。

如果您将鼠标光标放在Outlook.Category 上方,它应该会为您提供实现它。

建议你深入了解how interfaces work on C#

【讨论】:

  • 实现接口会创建这个公共字符串 Name { get { throw new NotImplementedException(); } 设置 { 抛出新的 NotImplementedException();但我不想为 Name 或任何其他属性重新实现 get/set,我只想访问它的值来创建新函数。
  • 使用自动属性。使用public string Name { get; set; }。其余属性也是如此
【解决方案2】:

您误以为使用对象继承来实现接口。尽管它们都使用相同的语法,但它们是非常不同的。

接口是允许相同通用方法和属性的许多不同实现的协定。这是您编写的类支持某些操作的保证。 您必须为接口编写实现。这允许更高级别的其他人不关心如何完成某事的细节,但它让他们知道它会完成。

对象继承允许您使用父类(非私有)的东西。它实际上是采用父类并添加更多功能。事实上,在 Java 中,这被称为“扩展”一个类。 找到一个已经实现接口Outlook.Category的类并从该类继承,然后调用base.Name()。然后您可以覆盖或扩展您需要的任何其他行为。

我不熟悉Outlook 命名空间,但CategoryClass 似乎是一个实现您的接口的类。你可以尝试继承它。

【讨论】:

  • VS告诉我不能使用CategoryClass并告诉我使用接口。
  • 嗯,这太糟糕了。就像我说的,你要么自己实现它,要么从实现它的东西继承。
【解决方案3】:

您到底想做什么?在 Outlook 中添加新类别?在这种情况下,您只需访问 Outlook 类别存储(注册表或配置文件中的默认存储)。

查看日历文件夹中的 IPM.Configuration.CategoryList 隐藏消息 - 您可以使用 OutlookSpy 查看它:转到日历文件夹,单击 OutlookSpy 功能区上的 IMAPIFolder 按钮,转到“关联内容”选项卡,找到 PR_MESSAGE_CLASS 属性 = "IPM.Configuration.CategoryList" 的消息,双击它。数据将位于 PR_ROAMING_XMLSTREAM 属性中。可以使用 Outlook 对象模型中的 MAPIFolder.GetStorage 访问隐藏的消息。

您还可以使用 Redemption 添加新类别 - 请参阅 RDOCategories 对象。像下面这样的东西可以完成这项工作(VBA):

 set vSession = CreateObject("Redemption.RDOSession")
 vSession.MAPIOBJECT = Application.Session.MAPIOBJECT
 set vStore = vSession.Stores.DefaultStore
 set vCategories = vStore.Categories
 set vCategory = vCategories.Add("Redemption Category", olCategoryColorPeach)

【讨论】:

  • 我正在尝试创建一个停靠在界面上的插件,该插件允许在文本框上进行键盘输入:标签(添加类别)、文件(发送到文件夹)、修改属性等。我想继承用于获取/设置具有附加功能的类别的界面。 VBA 无法创建停靠组件。
  • 正如其他发帖者所提到的,您不能从 COM 接口派生。您在考虑 Outlook 任务窗格吗? msdn.microsoft.com/en-us/library/aa942864.aspx
猜你喜欢
  • 2023-03-10
  • 2010-11-10
  • 1970-01-01
  • 2017-01-07
  • 2017-03-16
  • 2020-09-06
  • 2019-06-01
  • 2010-11-23
  • 1970-01-01
相关资源
最近更新 更多