2012-10-15 155 views
1

我有一些集合List<ObjectId>稱爲'ids'。我想讓用戶爲'ids'創建靈活的過濾器。解析表達式

我想創建一個文本框,用戶必須編寫一個過濾器字符串。例如:

item => item.ClassName == "Rectangle" 

這個表達式我需要申請'ids'上的每個項目。我怎樣才能嘗試解析它的驗證?我如何在我的代碼中爲每個「ID」項目運行它?

+1

這是這樣的:http://msdn.microsoft.com/en-us/library/bb397951.aspx – BlackBear

+1

的ObjectId是'int'或類? –

+0

@CongLong它是階級,而不是結構。 –

回答

1

你可以採取的Dynamic LINQ

+0

是的,我認爲,這是我必要的!謝謝! –

+0

噢,停下來...是否只用數據庫工作? –

+0

@Bush:你可以先調用'AsQueryable()' –

1

你爲什麼不創建一個擴展列表中的一個類,那麼你可以創建get方法,如:

public class ObjectIdCollection : List<ObjectId> 
{ 
    public ObjectIdCollection() { } 
    public ObjectId this[string classname] 
    { 
     get 
     { 
      foreach(ObjectId id in this) if(id.ClassName == classname) return id; 
      return null; 
     } 
    } 
} 

這將與任何指定的類名返回的第一個ID,如果沒有則爲null發現

+0

否,過濾器的表達式可以是ANY。用戶必須通過文本框進行設置。我必須用它表達。 –

0

優勢,他們有很多lambda expression parsers可用。

使用以下邏輯解析並執行基於文本框(說txtFilter)過濾器字符串。

var ids = new List<ObjectId> 
      { 
       new ObjectId { ClassName = "Rectangle1", ID = 1 }, 
       new ObjectId { ClassName = "Rectangle2", ID = 2 } 
      }; 

string code = txtFilter.Text; (Ex: "item => item.ClassName == \"Rectangle1\"" ;) 

Func<ObjectId, bool> func = ExpressionParser.Compile<Func<ObjectId, bool>>(code);  

ids.ForEach(obejctId => 
     { 
      Console.WriteLine(func.Invoke(obejctId)); 
     }); 

輸出是

True 
    False