gpt4 book ai didi

c# - 动态评估属性的通用函数

转载 作者:行者123 更新时间:2023-12-04 10:30:47 24 4
gpt4 key购买 nike

我有以下类(class):

public class Vehicle
{
public string Name { get; set; }
public bool CanFly { get; set; }
public bool CanDive { get; set; }
}

public class Hdd
{
public string Name { get; set; }
public bool CanRead { get; set; }
public bool CanWrite { get; set; }
public bool CanCopy { get; set; }
}

我想编写一个函数来过滤例如是否存在特定汽车(按 firstOrDefault 名称过滤)然后检查给定条件作为参数,例如 CanFly 或 CanDive ...等

所以我在想:
public class TestProperties
{
public bool Check<T>(List<T> items, string name,
Expression<Func<T, bool>> expression)
{
var expr = (MemberExpression)expression.Body;
var prop = (PropertyInfo)expression.Member;
//1- Filter items with the given name
// return false if no records found
// return false if the condition fails
}
}

然后我会调用函数如下
var myHdds= GetHdd();
var myCars= GetCars();
var CanRead = Check<Hdd>(myHdds,"samsung",x => x.CanRead);
var CanFly = Check<Vehicle>(myCars,"Audi",x => x.CanFly);

如何实现检查功能?

最佳答案

你快到了。尝试这个 -

public bool Check<T>(List<T> items, Expression<Func<T, bool>> expression)
{
return items.Any(x => expression.Compile()(x));
}

或者,
public bool Check<T>(List<T> items, Func<T, bool> compiledExp)
{
return items.Any(x => compiledExp(x));
}

并像这样打电话 -
Check<Vehicle>(myCars, x => x.Name == "Audi" && x.CanFly);
Check<Hdd>(myHdds,x => x.Name == "Samsung" && x.CanRead);

但现在想想,你真的不需要一种方法来做到这一点。它实际上是一行代码。

我个人更喜欢扩展方法 -
public static bool Check<T>(this List<T> items, Func<T, bool> compiledExp)
{
return items.Any(x => compiledExp(x));
}

并调用 -
myHdds.Check(x => x.Name == "Samsung" &&  x.CanRead);

关于c# - 动态评估属性的通用函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60424388/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com