C# 在lambda表达式c中使用字符串作为属性#

C# 在lambda表达式c中使用字符串作为属性#,c#,lambda,C#,Lambda,我有一个传递字符串和列表的方法。我试图实现的是将字符串转换为lambda expression属性 private someMethod(string myTypeString, List<Values> typeList) { foreach(var type in typeList.Where(x => x."myTypeString" > DateTime.Now)) { //do my loop } } privateSo

我有一个传递字符串和列表的方法。我试图实现的是将字符串转换为lambda expression属性

private someMethod(string myTypeString, List<Values> typeList)
{
    foreach(var type in typeList.Where(x => x."myTypeString" > DateTime.Now))
    {
        //do my loop
    }
}
privateSomeMethod(字符串myTypeString,列表typeList)
{
foreach(在typeList.Where(x=>x.“myTypeString”>DateTime.Now)中键入变量)
{
//做我的循环
}
}
有办法吗?

您可以尝试使用反射:

使用系统反射;
...
私有方法(字符串myTypeString,列表typeList)
{
PropertyInfo pi=typeof(值)
.GetProperty(myTypeString,
System.Reflection.BindingFlags.Instance|
System.Reflection.BindingFlags.NonPublic |//私有/内部/受保护
System.Reflection.BindingFlags.Public);
//属性存在,可以读取并返回DateTime
if(null==pi)
return;//或抛出异常
否则如果(!pi.CanRead)
return;//或抛出异常
else if(pi.PropertyType!=typeof(DateTime))
return;//或抛出异常
foreach(类型列表中的变量类型
.Where(x=>(DateTime)(pi.GetValue(x,null))>DateTime.Now))
{
//做我的循环
}
}
  • 在某处创建此方法
  • 公共静态对象GetPropValue(对象src,字符串propName) { 返回src.GetType().GetProperty(propName).GetValue(src,null); }
  • 在lambda表达式中使用该方法
  • 私有someMethod(字符串myTypeString,列表typeList) { foreach(typeList.Where(x=>(DateTime)GetPropValue(x,myTypeString)>DateTime.Now)中的var类型) { //做我的循环 } }
    通过反思。你发布的内容无效。不能有x“myTypeString”。您可以这样做(x=>DataTime.Parse(x.myTypeString)>DataTime.Now),为什么不重新设计方法来接收
    谓词呢?你不需要反思,你只需要发送你想申请的表达。把前两条评论放在一起:可以通过反思来完成,也许你可以在@BojanB链接的问题上得到帮助。但是你应该考虑运行时行为,如果你有大的列表来过滤你的反射,那么这不是你应该做的事情。这是一种巨大的“代码气味”。一种可能的解决方案是向该方法发送Func。尽可能避免反思。
    
    using System.Reflection;
    ...
    
    private void someMethod(string myTypeString, List<Values> typeList)
    {
        PropertyInfo pi = typeof(Values)
          .GetProperty(myTypeString,
             System.Reflection.BindingFlags.Instance | 
             System.Reflection.BindingFlags.NonPublic | // private/internal/protected  
             System.Reflection.BindingFlags.Public);
    
        // property exists, can be read and returns DateTime
        if (null == pi)
          return; // or throw exception
        else if (!pi.CanRead)  
          return; // or throw exception 
        else if (pi.PropertyType != typeof(DateTime))
          return; // or throw exception
    
        foreach(var type in typeList
          .Where(x => (DateTime) (pi.GetValue(x, null)) > DateTime.Now))
        {
            //do my loop
        }
    }
    
    public static object GetPropValue(object src, string propName) { return src.GetType().GetProperty(propName).GetValue(src, null); } private someMethod(string myTypeString, List typeList) { foreach(var type in typeList.Where(x => (DateTime)GetPropValue(x, myTypeString) > DateTime.Now)) { //do my loop } }