Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/274.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#在LINQ语句中使用propertyinfo(反射)_C#_Linq_Reflection - Fatal编程技术网

C#在LINQ语句中使用propertyinfo(反射)

C#在LINQ语句中使用propertyinfo(反射),c#,linq,reflection,C#,Linq,Reflection,而不是手动设置对象中的每个布尔属性。我想使用反射对所有布尔属性执行此操作 //For each boolean property: if any in collection is true, result is true. private ActionFlagsViewModel StackActionFlagsViewModels(List<ActionFlagsViewModel> afList) { var result = new ActionFlagsViewMod

而不是手动设置对象中的每个布尔属性。我想使用反射对所有布尔属性执行此操作

//For each boolean property: if any in collection is true, result is true.
private ActionFlagsViewModel StackActionFlagsViewModels(List<ActionFlagsViewModel> afList)
{
    var result = new ActionFlagsViewModel();
    foreach (var propInfo in typeof(ActionFlagsViewModel).GetProperties().Where(p => p.PropertyType == typeof(System.Boolean)))
    {
        // TODO: Do this using reflection for each property info.
        result.ShowActionAbort = afList.Where(afvm => afvm.ShowActionAbort == true).Any();
        result.ShowActionAssign = afList.Where(afvm => afvm.ShowActionAssign == true).Any();
    }
    return result;
}
//对于每个布尔属性:如果集合中的任何属性为true,则结果为true。
私有ActionFlagsViewModel堆栈ActionFlagsViewModels(列表)
{
var result=new ActionFlagsViewModel();
foreach(typeof(ActionFlagsViewModel.GetProperties().Where(p=>p.PropertyType==typeof(System.Boolean))中的var-propInfo)
{
//TODO:使用每个属性信息的反射来执行此操作。
result.ShowActionAbort=afList.Where(afvm=>afvm.ShowActionAbort==true).Any();
result.ShowActionAssign=afList.Where(afvm=>afvm.ShowActionAssign==true).Any();
}
返回结果;
}
这应该很容易,对吧?

这应该可以工作(在foreach内部):

这应该起作用(在foreach内部):

public ActionFlagsViewModel堆栈actionFlagsViewModels(列表)
{
var result=new ActionFlagsViewModel();
foreach(typeof(ActionFlagsViewModel.GetProperties().Where(p=>p.PropertyType==typeof(System.Boolean))中的var-propInfo)
{
SetValue(结果,(从afList中的m开始,其中(bool)propInfo.GetValue(m)选择true);
//SetValue(result,afList.Where(afvm=>Convert.ToBoolean(propInfo.GetValue(afvm))==true.Any());
}
返回结果;
}

好吧,这管用

这两种说法都有效。但是哪一个更好呢

public ActionFlagsViewModel堆栈actionFlagsViewModels(列表)
{
var result=new ActionFlagsViewModel();
foreach(typeof(ActionFlagsViewModel.GetProperties().Where(p=>p.PropertyType==typeof(System.Boolean))中的var-propInfo)
{
SetValue(结果,(从afList中的m开始,其中(bool)propInfo.GetValue(m)选择true);
//SetValue(result,afList.Where(afvm=>Convert.ToBoolean(propInfo.GetValue(afvm))==true.Any());
}
返回结果;
}

好吧,这管用


这两种说法都有效。但是哪一个更好呢

当你已经知道你的类型时使用反射看起来非常复杂。根据方法的运行频率(以及性能对代码的影响程度),还需要内存和CPU成本。在将来的更改中,可能会向模型中添加新操作。这段代码是表示逻辑的一部分。我希望代码保持正常工作,这意味着处理添加的新标志/布尔值。如果不是通过反射完成的话,另一个程序员(将来可能是我)可能会忘记更新这个方法。如果性能成为一个问题,我将使用T4模板生成此代码。当您已经知道自己的类型时,使用反射似乎非常复杂。根据方法的运行频率(以及性能对代码的影响程度),还需要内存和CPU成本。在将来的更改中,可能会向模型中添加新操作。这段代码是表示逻辑的一部分。我希望代码保持正常工作,这意味着处理添加的新标志/布尔值。如果不是通过反射完成的话,另一个程序员(将来可能是我)可能会忘记更新这个方法。如果性能成为问题,我将使用T4模板生成此代码。
propInfo.SetValue(result, (from m in afList where (bool)propInfo.GetValue(m) select true).FirstOrDefault())

public ActionFlagsViewModel StackActionFlagsViewModels(List<ActionFlagsViewModel> afList)
    {
        var result = new ActionFlagsViewModel();
        foreach (var propInfo in typeof(ActionFlagsViewModel).GetProperties().Where(p => p.PropertyType == typeof(System.Boolean)))
        {
            propInfo.SetValue(result, (from m in afList where (bool)propInfo.GetValue(m) select true).FirstOrDefault());
            //propInfo.SetValue(result, afList.Where(afvm => Convert.ToBoolean(propInfo.GetValue(afvm)) == true).Any());
        }
        return result;
    }