在多个c#类之间共享属性

本文关键字:之间 共享 属性 | 更新日期: 2023-09-27 18:01:54

我试图在这里最大化我的代码重用。我有一个SearchQueryDto,其字段如下:

public class SearchQueryDto{
    // some other properties 
    public string SearchUsername { get; set; }         // repetition 1
    public string SearchProfile { get; set; }          // repetition 1
    public SearchInterest SearchInterest { get; set; } // repetition 1
    // some other properties 
}

然后,我有一个Broadcast的数据库模型,如下:

public class Broadcast {
    // some other different properties 
    public string SearchUsername { get; set; }          // repetition 1     
    public string SearchProfile { get; set; }           // repetition 1
    public SearchInterest SearchInterest { get; set; }  // repetition 1
    // some other different properties 
    public Status Status {get; set;}                    // repetition 2
    public DateTime DateStarted {get; set;}             // repetition 2
}

然后,我有一个BroadcastMessage的数据库模型,如下:

public class BroadcastMessage {
    // some other properties 
    public Status Status {get; set;}                    // repetition 2
    public DateTime DateStarted {get; set;}             // repetition 2
}

现在,添加新的搜索条件意味着我必须去添加字段到我的数据库模型Broadcast和DTO。如何在两个类之间共享属性?继承似乎不是答案,因为我可能最终在Broadcast和其他类型之间共享属性。

我在找一些简单的东西,比如:

// handles repetition 1
public class SearchCriteria{
    public string SearchUsername { get; set; }
    public string SearchProfile { get; set; }
    public SearchInterest SearchInterest { get; set; }
}
// handles repetition 2
public class StatusProperties{
    public Status Status {get; set;}
    public DateTime DateStarted {get; set;}
}
public class SearchQueryDto: SearchCriteria{               
    // some other properties 
}
public class Broadcast : SearchCriteria, StatusProperties{ // multiple inheritance :(
    // some other different properties 
}
public class BroadcastMessage : StatusProperties{
    // some other properties 
}

我不认为继承会工作,因为Broadcast的需要,我不认为接口会工作,因为我已经在错误的方向迈出了一步-更新n+1的东西,而不仅仅是n的东西,以方便编译器强制继承(不是我正在寻找的方便)。

我也不想将这些属性隐藏在另一个类的实例化之后,因为我认为这些原因超出了这里的范围。

在多个c#类之间共享属性

我不太喜欢使用共享容器类或继承,因为在我看来,这将模型、DTO对象、ViewModels和其他分离的类过多地放在一起。
我认为在每个类中实现属性是最好的解决方案。


但是我认为使用一个接口来避免被遗忘的属性是没有问题的。

public interface IBroadcastMessage{
    public Status Status {get; set;}
    public DateTime DateStarted {get; set;}
}
public class Broadcast : IBroadcastMessage, ISearchQueryDto { /* ... */ }
public class BroadcastMessage : IBroadcastMessage { /* ... */ }

这并不能避免类似的代码,相反,你必须重新编写所有的属性。但是如果你在接口中实现它,你不能忘记在所有类中实现它。
这样的界面在其他地方也很有用。例如,为传递IBroadcastMessage而不关心它的确切类型


在这种情况下,重构如何?如果您可以创建一个基类,该基类可以根据继承的实现过滤项并将它们添加到列表中,那么为什么要为每个新标准添加属性呢?这只是一个想法。

创建一个两个类都有实例的对象。对SearchCriteria的更新将更新这两个类中的属性。你的两个类(broadcast和profilesearchdto)保持解耦。

SearchCriteria{
    public string SearchUsername { get; set; }
    public string SearchProfile { get; set; }
    public SearchInterest SearchInterest { get; set; }
}
public class ProfileSearchDto {
    public SearchCriteria searchCriteria {get; set;}
}
public class Broadcast {
    public SearchCriteria searchCriteria {get; set;}
}