在多个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
的东西,以方便编译器强制继承(不是我正在寻找的方便)。
我也不想将这些属性隐藏在另一个类的实例化之后,因为我认为这些原因超出了这里的范围。
我不太喜欢使用共享容器类或继承,因为在我看来,这将模型、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;}
}