C#如何解决EditorAttribute使用导致的循环依赖?

C#如何解决EditorAttribute使用导致的循环依赖?,c#,circular-dependency,C#,Circular Dependency,在我的项目中,我有两个库,它们目前会导致循环依赖,而我无法解决这个问题 一个库为整个解决方案提供公共数据结构。此库包含类似以下内容的构造: namespace Common { public class Foo { //[Editor( typeof( UserEditor ), typeof( UITypeEditor ) )] public UInt32 OwnerId { get; set; } } public class User { public

在我的项目中,我有两个库,它们目前会导致循环依赖,而我无法解决这个问题

一个库为整个解决方案提供公共数据结构。此库包含类似以下内容的构造:

namespace Common {
  public class Foo {
    //[Editor( typeof( UserEditor ), typeof( UITypeEditor ) )]
    public UInt32 OwnerId { get; set; }
  }

  public class User {
    public UInt32 Id { get; set; }
  }
}
现在,在我们解决方案中的一个项目中,我们希望通过PropertyGrid编辑
Foo
实例,并且应该使用自定义编辑器编辑
OwnerId
属性;这个:

using Common;

namespace Common.Gui {
  public class OwnerEditor : UITypeEditor {
    public static List<User> Users { get; set; }
  }
}
使用公共资源;
名称空间Common.Gui{
公共类所有者编辑器:UITypeEditor{
公共静态列表用户{get;set;}
}
}
现在,我不能只将
EditorAttribute
添加到
Foo.OwnerId
中,因为这将创建循环依赖项,我希望保持对
Common.Gui
的引用不在
Common
中。我还希望避免将代码从
Common
拉到新程序集中,因为许多其他项目都引用它


我发现了一个关于的问题,听起来像是一个完美的解决方案,但我无法熟练地解决我的问题。

我认为这是一个有缺陷的设计的标志。是否希望包含
Foo
的类库不知道编辑GUI?在这种情况下,它不应该包含EditorAttribute


一种解决方案是将
Foo
类视为MVVM体系结构中的模型。然后,您可以在应用了
EditorAttribute
的GUI类库中创建包装视图模型。如果您提取我放在模型类库中的接口IFoo,您可以使用decorator模式。

我认为这是有缺陷设计的标志。是否希望包含
Foo
的类库不知道编辑GUI?在这种情况下,它不应该包含EditorAttribute


一种解决方案是将
Foo
类视为MVVM体系结构中的模型。然后,您可以在应用了
EditorAttribute
的GUI类库中创建包装视图模型。如果您提取我放在模型类库中的接口IFoo,您可以使用decorator模式。

您可以通过名称引用编辑器类来创建运行时引用

public class Foo {
    [Editor( "Common.Gui.OwnerEditor, Common", typeof( UITypeEditor ) )]
    public UInt32 OwnerId { get; set; }
  }

可以按名称引用编辑器类以创建运行时引用

public class Foo {
    [Editor( "Common.Gui.OwnerEditor, Common", typeof( UITypeEditor ) )]
    public UInt32 OwnerId { get; set; }
  }

不过,我同意安德斯的回答。您的通用模块仍然知道您的GUI模块,因此它不是一个很好的设计。+1:您可以在引用*.design.dll的MS库中看到这一点。事实上,我最初试图解决依赖关系,但这导致编辑器无法在PropertyGrid中使用。编辑:我的错误,那是由打字错误引起的。这个建议现在很有效。不过,我同意安德斯的回答。您的通用模块仍然知道您的GUI模块,因此它不是一个很好的设计。+1:您可以在引用*.design.dll的MS库中看到这一点。事实上,我最初试图解决依赖关系,但这导致编辑器无法在PropertyGrid中使用。编辑:我的错误,那是由打字错误引起的。这个建议现在很管用。