2012-07-26 72 views
2

我正在嘗試完成動態創建c#語句以避免使用下面顯示的switch語句。我查看了CodeSnippetStatement類,但無法使其工作。動態創建c#語句

動態應用;

 switch (entity) 
     { 
      case "entity_1": 
       apps = Xrm.Entity_1Set.SingleOrDefault(a => a.Id.Equals(guid)); 
       break; 
      case "entity_2": 
       apps = Xrm.Entity_2Set.SingleOrDefault(a => a.Id.Equals(guid)); 
       break; 
      case "entity_3": 
       apps = Xrm.Entity_3Set.SingleOrDefault(a => a.Id.Equals(guid)); 
       break; 

...

我願做這樣的事情(通過實體動態轉換爲字符串並轉換在運行時執行語句):

應用= CodeSnippetStatement(的String.Format ( 「XRM {0} Set.SingleOrDefault(A => a.Id.Equals(GUID)。」,實體));

這是可能的??

+0

歡迎StackOverflow上。如果答案解決了你的問題,[你可以接受這個答案](http://meta.stackexchange.com/questions/5234)。然後,您也可以用灰色向上箭頭向上投票一個或多個答案。 – 2012-07-26 23:14:42

回答

1

假設Entity_1Set是一個的Xrm公共財產,你可以使用反射:

using System.Reflection; // at the top of your code file 

var propertyName = "E" + entity.Substring(1) + "Set"; 
apps = Xrm.GetType().GetProperty(propertyName).GetValue(Xrm); 

如果Xrm是一個類(不是一個靜態類引用)的實例,這隻會工作。

請注意,反射比直接訪問屬性慢。如果你只是偶爾做這件事,這個時間成本並不是很高。但在一個循環內,它可能會加起來。

另一種方法是緩存您的EntitySet的情況下進入詞典:

private Dictionary<string, EntitySet> entityMappings; // at the top of your class 

var xrm = GetXrmFromSomewhere(); 
entityMappings = new Dictionary<string, EntitySet> 
{ 
    { "entity_1", xrm.Entity_1Set }, 
    { "entity_2", xrm.Entity_2Set }, 
    { "entity_3", xrm.Entity_3Set } 
}; 

然後你就只需要做:

var app = entityMappings[entity].SingleOrDefault(a => a.Id.Equals(guid));