在多个C#类之间共享属性
我试图在这里最大限度地重用代码。我有一个在多个C#类之间共享属性,c#,.net,composition,C#,.net,Composition,我试图在这里最大限度地重用代码。我有一个SearchQueryDto,其中包含如下字段: public class SearchQueryDto{ // some other properties public string SearchUsername { get; set; } // repetition 1 public string SearchProfile { get; set; } // repetition 1
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
}
然后,我有一个广播
的数据库模型,包括以下内容:
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
东西,以方便编译器强制执行继承(而不是我正在寻找的方便)
我也不想将这些属性隐藏在另一个类的实例化后面,因为我认为这些属性不在这里的范围之内。创建一个两个类都有实例的对象。对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;}
}
我不太喜欢使用共享容器类或继承,因为在我看来,这会使模型、DTO对象、ViewModels和其他分离的类过于集中。
我认为在每个类中实现属性是最好的解决方案
但是我认为使用一个接口来避免被遗忘的属性是没有问题的
public interface IBroadcastMessage{
public Status Status {get; set;}
public DateTime DateStarted {get; set;}
}
public class Broadcast : IBroadcastMessage, ISearchQueryDto { /* ... */ }
public class BroadcastMessage : IBroadcastMessage { /* ... */ }
这无助于避免类似的代码,相反,您必须再次编写所有属性。但是如果在接口中实现它,就不能忘记在所有类中实现它。这样的接口在其他地方也很有用。e、 g.用于传递
IBroadcastMessage
,而不关心它的确切类型
在这种情况下,重构怎么样?如果可以创建一个基类,该基类可以根据继承的实现过滤项并将其添加到列表中,为什么要为每个新条件添加属性?这只是一个想法。也许一个解决方案是创建一个中间类,它将保存您想要共享的公共属性,然后您的两个类都有一个对该类的引用…@SuperPeanut-我喜欢这样。。。但是我如何在不将这些对象嵌入到另一个属性后面的情况下进行引用位呢?您所描述的是DTO的主要目标:通过限制其属性并只选择您真正想要发送的属性,您可以避免可能发生的一些问题,例如错误地序列化惰性关系(例如,如果使用自动映射器将数据从一个对象复制到另一个对象)。我只看到过这样的结果:过于复杂的代码变得难以更改。这些对象的用途不同,因此它们不需要从单个实现中提取。我不认为这是一个值得解决的问题。如果您认为编写代码很费力,请思考代码生成。我会将它们完全分开,键入每个cla以最短、最有说服力的方式将ss和属性作为副本,并编写单元测试以对设计一致性做出断言。我正要发布这篇文章。这是我在没有继承的情况下看到它的唯一方法。我真的试图避免将这些属性隐藏在另一个属性后面。然后使用接口。@wizardzz,如我的问题,接口不能解决我的问题。@RobVious,我正在试图了解为什么接口不能解决你的问题。如果你使用接口,那么额外的更新是什么。接口和基础类?但不是所有使用接口的类,接口将帮助阻止对属性的更改,因为你不会被破坏直接访问属性。这实际上是1对2,而不是n对n+1。正如我在问题中所说的,继承和接口都不能解决我的特定问题。我完全知道它们提供的好处,但这些不是我想要的好处。@Robbous我写这个答案主要是因为我第一段的第三行。