C# 动态检查模型的每个KeyValuePair值

C# 动态检查模型的每个KeyValuePair值,c#,model-view-controller,viewmodel,C#,Model View Controller,Viewmodel,我有一个这样的视图模型,它是从我的验证器创建的 public class ViewModel { public KeyValuePair<int, RuleType> Foo { get; set; } public KeyValuePair<string, RuleType> Bar { get; set; } } 公共类视图模型 { 公钥值对Foo{get;set;} 公钥值对条{get;set;} } 我的真实视图模型有20多个字段。验证数据后,

我有一个这样的视图模型,它是从我的验证器创建的

public class ViewModel
{
    public KeyValuePair<int, RuleType> Foo { get; set; }
    public KeyValuePair<string, RuleType> Bar { get; set; }
}
公共类视图模型
{
公钥值对Foo{get;set;}
公钥值对条{get;set;}
}
我的真实视图模型有20多个字段。验证数据后,类型为
ViewModel
的通用列表将返回到我的MVC视图并处理为报告。然而,出现了一个特性请求,用户只希望看到带有错误和警告的模型,不包括有效的实体<代码>规则类型是一个枚举器。如果密钥对的所有值都是
RuleType.Success
,则模型有效

是否可以循环检查每个模型并检查
规则类型
,而不必手动检查每个属性?My
GetAllModelsWithErrors()
函数将返回无效模型的列表。我相信反射可能是一个解决方案,但我不确定它是否是一个好的解决方案。

尝试以下方法:

    private IEnumerable<ViewModel> GetInvalidModels(ViewModel[] viewModels)
    {
        return 
            from viewModel in viewModels 
            from prop in typeof(ViewModel).GetProperties() 
            let ruleType = ((KeyValuePair<object, RuleType>)prop.GetValue(viewModel, null)).Value 
            where ruleType != RuleType.Success 
            select viewModel;
    }
private IEnumerable GetInvalidModels(ViewModel[]viewModels)
{
返回
从viewModels中的viewModel
从typeof(ViewModel.GetProperties()中的prop
让ruleType=((KeyValuePair)prop.GetValue(viewModel,null)).Value
其中ruleType!=ruleType.Success
选择viewModel;
}

您可以注册ViewModel的所有属性,也可以使用反射。例如,您可以通过每个属性的
变异体来注册它们(这样您将得到一组
KeyValuePair
实例,并可以对它们进行验证)。
let ruleType
行在我对结果使用
ToList()
时引发无效异常。如果我的一些KeyValuePair值具有可为null的类型,我是否应该做一些不同的事情?正如您自己所说,“如果密钥对的所有值都是RuleType.Success,那么模型是有效的”。因此,我的查询基于这样一个假设,即KeyValuePairs中的值始终是RuleType类型,它是一个枚举,因此不可为null。