C# 如何使用“获取属性”;接口隔离原则“;不在ViewModel中强制转换

C# 如何使用“获取属性”;接口隔离原则“;不在ViewModel中强制转换,c#,interface,casting,C#,Interface,Casting,根据“接口隔离原则”,我有 现在我有一个简单的例子: List<IMessage> Messages = new List<IMessage>(){new SmsMessage("SomeText"), EmailMessage("Hi!", "To Brad Pitt")}; List Messages=new List(){new SmsMessage(“SomeText”), 电子邮件(“嗨!”,“致布拉德·皮特”)}; 如何在邮件[1]项目中获取“主题”属性

根据“接口隔离原则”,我有

现在我有一个简单的例子:

List<IMessage> Messages = new List<IMessage>(){new SmsMessage("SomeText"), 
EmailMessage("Hi!", "To Brad Pitt")};
List Messages=new List(){new SmsMessage(“SomeText”),
电子邮件(“嗨!”,“致布拉德·皮特”)};

如何在邮件[1]项目中获取“主题”属性(例如),而不将项目强制转换为EmailMessage?我应该使用哪种模式?

这是一个多态性问题

主题
放在
IMessage
上,当没有主题时返回
null
(也可以提供
hasubject
属性),否则需要强制转换


没有对错之分。如果您不想让IMessage了解主题,您就不想在那里拥有这样的属性。如果有许多不同的子接口和子类型,则强制转换可能更好。

您将如何处理
subject
属性?如果
IMessage
没有
subject
属性会发生什么?我认为这与模式没有任何关系。您应该使用(消息[1]作为IEmailMessage)?.Subject如果不强制转换.IMessage-它是一个实体,则无法执行此操作。我想在WPF中将这个实体提供给SimpleDataGrid,我想知道如何为此创建ViewModel。为此,我应该获得所有接口实现中的所有属性。但是,我想知道:没有卡斯蒂格,这可能吗?嗯,你应该找到一个解决办法。一种方法是覆盖tostring。好吧,你不能用任何比强制转换更简单的方法来实现这一点。你可以拥有一个基础抽象类,并覆盖任何派生类的属性/方法。返回类型也可以是抽象的。在这种情况下,您可以自由添加/更改任何想要的属性(注意LSP)
List<IMessage> Messages = new List<IMessage>(){new SmsMessage("SomeText"), 
EmailMessage("Hi!", "To Brad Pitt")};