C# 在lambda表达式c中使用字符串作为属性#
我有一个传递字符串和列表的方法。我试图实现的是将字符串转换为lambda expression属性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
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))
{
//做我的循环
}
}
通过反思。你发布的内容无效。不能有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
}
}