2016-11-08 81 views
0

我有一個方法,我將字符串和一個列表傳遞給。我想要實現的是將字符串轉換爲lambda表達式屬性。使用字符串作爲拉姆達表達式c中的屬性#

private someMethod(string myTypeString, List<Values> typeList) 
{ 
    foreach(var type in typeList.Where(x => x."myTypeString" > DateTime.Now)) 
    { 
     //do my loop 
    } 
} 

有沒有辦法做到這一點?

+0

通過反射的方法。 – Oswald

+0

在你貼的時候將不起作用。你不能有x。「myTypeString」。你可以做這樣的事情(x => DataTime.Parse(x.myTypeString)> DataTime.Now) – jdweng

+3

爲什麼不重新設計接收「謂詞」的方法呢?您不需要反射,只需發送要應用的表達式即可。 – jorgonor

回答

2

您可以嘗試使用反射

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 
    } 
} 
0
  1. 地方創建此方法。
 
    public static object GetPropValue(object src, string propName) 
    { 
     return src.GetType().GetProperty(propName).GetValue(src, null); 
    } 
  • 使用在lambda表達式
  •  private someMethod(string myTypeString, List typeList) 
        { 
         foreach(var type in typeList.Where(x => (DateTime)GetPropValue(x, myTypeString) > DateTime.Now)) 
         { 
          //do my loop 
         } 
        }