2012-07-26 70 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));