小编Ged*_*dde的帖子

为某些(但不是全部)继承的类引入setter

我很难在C#中实现一个只在抽象基类中有一个getter的属性,但是我需要在其中一个派生类中引入一个setter.


更新:有关此问题的一般示例的简短说明,请参阅此问题.选定的答案解释了为什么目前在C#中无法做到这一点,但是,在我看来还没有提供令人满意的解决方案.


我的类图概述如下:

类图

我的目标是两个类TextElementStaticTextElementReferenceSource应该具有包含getter和setter 的Text属性,而类TextElementReferenceTarget应该具有仅具有getter 的Text属性.我在引用所有这些对象时经常使用ITextElement,我需要确保ITextElement接口只有一个getter.此外,基类TextElement实现了许多通用代码,因此所有类都需要从该类继承.

我当前的代码如下所示:

接口:ITextElement

public interface ITextElement
{
    string Text { get; }
}
Run Code Online (Sandbox Code Playgroud)

接口:ITextElementUpdatable

public interface ITextElementUpdatable : ITextElement
{
    new string Text { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

抽象类:TextElement (这是我的问题所在,解释如下)

public abstract class TextElement : ITextElement
{
    // I want to mark this 'abstract', but that causes my problem
    public virtual string Text …
Run Code Online (Sandbox Code Playgroud)

.net c# inheritance overriding properties

6
推荐指数
1
解决办法
641
查看次数

以编程方式打开上下文菜单时如何引发ContextMenuOpening事件

当我使用打开上下文菜单时<control>.ContextMenu.IsOpen = true,上下文菜单将变为可见,但是打开或关闭事件均不会触发。

以编程方式打开上下文菜单时,如何确保ContextMenuOpeningand ContextMenuClosing事件引发?


演示:

看下面的XAML

<Button Name="ContextMenuButton" 
        Content="Click me!" 
        Click="ContextMenuButton_Click" 
        ContextMenuOpening="ContextMenuButton_OnContextMenuOpening"
        ContextMenuClosing="ContextMenuButton_OnContextMenuClosing">
    <Button.ContextMenu>
        <ContextMenu>
            <MenuItem Header="First element" />
            <MenuItem Header="Second element" />
        </ContextMenu>
    </Button.ContextMenu>
</Button>
Run Code Online (Sandbox Code Playgroud)

和下面的代码

public MainWindow() // Constructor
{
    InitializeComponent();
    ContextMenuButton.ContextMenuOpening += (sender, args) => Debug.Print("Opening #2");
    ContextMenuButton.ContextMenuClosing += (sender, args) => Debug.Print("Closing #2");
}

private void ContextMenuButton_Click(object sender, RoutedEventArgs e)
{
    Button button = (sender as Button);
    button.ContextMenu.IsOpen = true; // How should I open the ContextMenu?
}

private void …
Run Code Online (Sandbox Code Playgroud)

c# wpf contextmenu wpf-controls

5
推荐指数
1
解决办法
4326
查看次数

如何设置一个单元测试,如果另一个单元测试失败,则跳过该单元测试?

xUnit.net中是否有一种方法可以使单元测试依赖于另一个单元测试,以便在另一个测试失败时将其跳过

注意:这不是关于测试之间共享夹具或使测试彼此耦合等问题。我避免了这一点。

Given:     Unit tests OuterTest and InnerTest
Condition: If OuterTest is dependent on InnerTest and InnerTest fails
Result:    OuterTest is skipped (ideally with an explanation)
Run Code Online (Sandbox Code Playgroud)

基本原理

这是单元测试序列化的一部分,但是我也可以想到其他用例。我有一个外部类型,它具有内部类型的依赖关系,其中内部被序列化为外部序列化的一部分。我有一个针对内部类型的序列化单元测试,如果失败了,我知道对外部的序列化单元测试将由于嵌套而失败。

类型看起来像这样:

[Serializable]
class Inner {}

[Serializable]
class Outer {

    public Outer(Inner inner) {
        Inner = inner;
    }

    [Serializable]
    Inner Inner { get; }
}
Run Code Online (Sandbox Code Playgroud)
  • 我真的不想在外部的单元测试中使用内部的Stub,因为这迫使我引入内部的接口并弄乱了仅需要这些类型的单个具体实现的层次结构。这也迫使我为存根创建自定义序列化程序,这听起来比好处多麻烦。

  • 鉴于很难为内部类创建存根,以下是我的论点:我不希望两个测试都失败,因为这很难找到失败的根本原因。我认为最好跳过外部测试并给出相关性失败的警告。

问题

搜索一段时间后,我没有找到有关此用例的任何信息,因此我有以下问题:

  1. 是否可以基于xUnit.net中其他单元测试的结果来创建有条件地运行的测试?
  2. 这是一个不好的请求,还是某种代码的味道,如果是,为什么?

c# unit-testing xunit.net

5
推荐指数
1
解决办法
259
查看次数

通过 VSTO 在 PowerPoint 设计器中捕捉鼠标事件

我正在使用 C#/VSTO 为 PowerPoint (2013) 开发插件。当用户处于设计模式而不是演示模式时,加载项将工作。

如何捕捉与幻灯片上的形状/对象有关的鼠标事件,例如 mouseOver、mouseDown 等?我想收听这些事件以创建位于对象/形状附近的自定义 UI。有没有我可以监听的事件,或者是否需要使用更高级的方法,例如创建全局鼠标监听器,将坐标转换为 PowerPoint 形状,并循环浏览幻灯片上的形状以查看鼠标是否在任何形状的边界?我还将欣赏该问题的其他创造性解决方案。

我试图在没有任何运气的情况下寻找答案。但是,我知道这在某种程度上是可能的,因为其他加载项正在执行我想要的操作。一个例子是 Think-Cell ( https://www.youtube.com/watch?v=qsnciEZi5X0 ),其中您操作的对象是“普通” PowerPoint 对象,例如 TextFrames 和 Shapes。

我正在 Windows 8.1 Pro 上使用 .Net 4.5。

.net c# powerpoint vsto

4
推荐指数
1
解决办法
3263
查看次数