Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何提供泛型子属性_C#_Generics_Covariance - Fatal编程技术网

C# 如何提供泛型子属性

C# 如何提供泛型子属性,c#,generics,covariance,C#,Generics,Covariance,我们有一个实体框架模型,其中包含名为QuoteStatus和SystemStatus的类,分别对quote和系统的状态进行建模。这些类中的每一个都有一个导航属性,它是一个集合,其中包含状态更改时需要通知的人的电子邮件。QuoteStatus类看起来像这样(简化) 公共类QuoteStatus{ 公共int ID{get;set;} 公共字符串名称{get;set;} 公开名单通知; } 公共类报价通知{ 公共int ID{get;set;} 公共字符串电子邮件{get;set;} } Syst

我们有一个实体框架模型,其中包含名为QuoteStatus和SystemStatus的类,分别对quote和系统的状态进行建模。这些类中的每一个都有一个导航属性,它是一个集合,其中包含状态更改时需要通知的人的电子邮件。QuoteStatus类看起来像这样(简化)

公共类QuoteStatus{
公共int ID{get;set;}
公共字符串名称{get;set;}
公开名单通知;
}
公共类报价通知{
公共int ID{get;set;}
公共字符串电子邮件{get;set;}
}
SystemStatus和SystemStatusNotification类非常相似

现在,我们希望有一个WPF窗口,可以用来维护这两种状态(以及将来出现的任何其他状态)。其想法是在窗口顶部有一个下拉控件,用户在其中指定要显示的状态类型(报价或系统),并将值发送到视图模型

视图模型将具有数据的私有变量

private List<QuoteStatus> _quoteStatuses;
private List<SystemStatus> _systemStatuses;
private List”属性;
私有列表\u系统状态;
我们希望视图模型具有公共状态属性,该属性可以绑定到视图上的网格。根据用户在下拉列表中选择的值,Statuses属性将包含“U quoteStatuses”集合或“U systemStatuses”集合

为此,我们创建了一个基本状态类,并让QuoteStatus和SystemStatus类从中继承。那很好

我们在子集合方面遇到了问题。我们希望状态基类具有StatusNotifications集合,该集合将是QuoteStatusNotification类或SystemStatusNotification类的集合。我们无法确定如何创建StatusNotifications集合

从(见公认答案中的第二个建议)来看,我似乎可以用协方差来做这件事,但我不知道该怎么做


有人能解释这一点吗?

创建一个基类,该基类的属性在这两种类型中都是通用的。那你就可以通过了

List<StatusBaseClass> statuses;
列表状态;
您可以将任一类型放入此列表中

如果是混合列表,则可以通过以下方式获取各个类型:

var quoteStatuses = statuses.OfType<QuoteStatus>();
var systemStatuses = statuses.OfType<SystemStatus>();
var quoteStatuses=statuses.OfType();
var systemStatuses=statuses.OfType();

创建一个基类,该基类的属性在这两种类型中都是通用的。那你就可以通过了

List<StatusBaseClass> statuses;
列表状态;
您可以将任一类型放入此列表中

如果是混合列表,则可以通过以下方式获取各个类型:

var quoteStatuses = statuses.OfType<QuoteStatus>();
var systemStatuses = statuses.OfType<SystemStatus>();
var quoteStatuses=statuses.OfType();
var systemStatuses=statuses.OfType();
简单继承:

public class StatusBaseClass
{
    public List<StatusNotification> StatusNotifications;
}

public class QuoteStatus : StatusBaseClass
{
}

public class SystemStatus : StatusBaseClass
{
}

public class StatusNotification
{
}

public class QuoteStatusNotification : StatusNotification
{
}

public class SystemtatusNotification : StatusNotification
{
}
公共类StatusBaseClass
{
公开名单通知;
}
公共类QuoteStatus:StatusBaseClass
{
}
公共类SystemStatus:StatusBaseClass
{
}
公共类状态通知
{
}
公共类QuoteStatusNotification:StatusNotification
{
}
公共类SystemStatusNotification:状态通知
{
}
您可以将QuoteStatusNotificationo或SystemStatusNotification添加到基类列表中

例如,在xaml中,您可以为列表视图中的两个类提供不同的UI。请看这里:

例如:

<ListView ItemsSource="{Binding Statuses}">
    <ListView.Resources>
        <DataTemplate DataType="{x:Type viewModel:SystemStatus}">

        </DataTemplate>
        <DataTemplate DataType="{x:Type viewModel:QuoteStatus}">
        </DataTemplate>
    </ListView.Resources>
</ListView>

更详细地介绍您正在尝试做的事情,并可能提供更多帮助。

简单继承:

public class StatusBaseClass
{
    public List<StatusNotification> StatusNotifications;
}

public class QuoteStatus : StatusBaseClass
{
}

public class SystemStatus : StatusBaseClass
{
}

public class StatusNotification
{
}

public class QuoteStatusNotification : StatusNotification
{
}

public class SystemtatusNotification : StatusNotification
{
}
公共类StatusBaseClass
{
公开名单通知;
}
公共类QuoteStatus:StatusBaseClass
{
}
公共类SystemStatus:StatusBaseClass
{
}
公共类状态通知
{
}
公共类QuoteStatusNotification:StatusNotification
{
}
公共类SystemStatusNotification:状态通知
{
}
您可以将QuoteStatusNotificationo或SystemStatusNotification添加到基类列表中

例如,在xaml中,您可以为列表视图中的两个类提供不同的UI。请看这里:

例如:

<ListView ItemsSource="{Binding Statuses}">
    <ListView.Resources>
        <DataTemplate DataType="{x:Type viewModel:SystemStatus}">

        </DataTemplate>
        <DataTemplate DataType="{x:Type viewModel:QuoteStatus}">
        </DataTemplate>
    </ListView.Resources>
</ListView>


请更详细地了解您正在尝试执行的操作,也许可以提供更多帮助。

很抱歉,看到您的回复,我意识到我没有正确地解释问题。问题不在于Statuses属性,正如您所说,它可以通过基类完成。问题是如何将StatusNotifications集合添加到Status类。请看mu编辑的问题。对不起,阅读您的回复,我意识到我没有正确解释问题。问题不在于Statuses属性,正如您所说,它可以通过基类完成。问题是如何将StatusNotifications集合添加到Status类。请参见mu编辑的问题。为什么相同的技术不能用于通知类?创建QuoteStatusNotification和SystemStatusNotification继承自的BaseNotification类,并使基类的属性使用列表。为什么相同的技术不能用于通知类?创建一个QuoteStatusNotification和SystemStatusNotification继承自的BaseNotification类,并使基类的属性使用列表。我们已尝试了您建议的简单继承,但在设置Statuses集合时遇到问题,因为它会产生强制转换错误。然而,你的代码让我意识到我们太聪明了!现在一切正常,谢谢。感谢您提供有关XAML绑定的提示。在这种情况下,这不是我们想要的,而是对未来非常有用的提示!我们已经按照您的建议尝试了简单的继承,但是在设置Statuses集合时遇到了问题,因为它会导致转换错误。然而,你的代码让我意识到我们太聪明了!现在都在工作了,th