我正在尝试动态创建一个c#语句,以避免使用下面显示的switch语句。我查看了CodeSnippetStatement类,但无法使其正常工作。
动态应用;
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;
...
我想做类似的事情(将实体动态传递给字符串并将语句转换为在运行时执行):
apps = CodeSnippetStatement(String.Format(“Xrm。{0} Set.SingleOrDefault(a => a.Id.Equals(guid)”,entity));
这可能吗?
答案 0 :(得分: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));