C# 将接口实现拉入基类

C# 将接口实现拉入基类,c#,refactoring,interface,C#,Refactoring,Interface,我正在使用一个库,它要求我的视图实现一个接口,该接口只是一个依赖属性和get\set访问器。唯一的区别是DP的寄存器方法中的OwnerType。好吧,重复的代码是不好的,而且我在粘贴了几次之后忘记了更改OwnerType:)所以我想我应该尝试将其上移到基类中,让它确定类型。经过一番周折之后,我通过在构造函数中初始化它,并使用GetType()确定类型,使它开始工作。唯一的问题是当视图被销毁,并在以后重新创建时,这会导致DP已注册的ArgumentException 这种重构是个好主意吗 我做得对

我正在使用一个库,它要求我的视图实现一个接口,该接口只是一个依赖属性和get\set访问器。唯一的区别是DP的寄存器方法中的OwnerType。好吧,重复的代码是不好的,而且我在粘贴了几次之后忘记了更改OwnerType:)所以我想我应该尝试将其上移到基类中,让它确定类型。经过一番周折之后,我通过在构造函数中初始化它,并使用GetType()确定类型,使它开始工作。唯一的问题是当视图被销毁,并在以后重新创建时,这会导致DP已注册的ArgumentException

  • 这种重构是个好主意吗
  • 我做得对吗?:)
  • 如果1和2为真,如何检查DP是否已注册
  • @卡尔: 我不确定依赖项属性是否曾经被注销。我甚至不确定依赖项属性是否可以注销:)

    这里是原始类,xaml视图背后的代码(这个和它的基类是我创建的):

    元数据属性只是将查找字符串与类型相关联

    我认为它是有效的,因为当视图第一次创建时,注册只完成一次

    在基类中,寄存器似乎必须在构造函数中,因此我可以使用GetType()作为OwnerType。因此,当再次创建视图时,它会尝试再次注册,从而导致ArgumentException

    界面很简单:

    public interface IWorkSpaceAware
    {
        WorkspaceData WorkSpaceContextualData { get; set; }
    }
    
    找到的解决方案:


    我将Register OwnerType更改为typeof(MyViewBase),并将赋值放回字段中。

    对我来说,这听起来像是一个很好的重构,尽管在每个类中都有一个简单的方法,而在超类中有一个稍微复杂的方法,两者之间存在权衡

    我不明白的是,为什么在执行重构时行为会发生变化。当类的实例被销毁时,无论最初用于取消注册类的机制是什么,都应该继续工作;如果没有,那么探究为什么没有

    什么是联合国登记机制?对于直接实现接口的类,能否在调试器中单步执行它?在重构过程中,库中发生的一些反射可能会导致失败;如果是这样,最简单的方法可能是向库作者报告bug,并恢复到重复代码方法,直到修复为止。关于粘贴OwnerType后忘记更改它的问题,也许您可以从OwnerType被注释掉、为空或无法编译的代码段中粘贴它,以迫使您快速修复它

    public interface IWorkSpaceAware
    {
        WorkspaceData WorkSpaceContextualData { get; set; }
    }