2

我正在尝试动态完成创建 ac# 语句以避免使用下面显示的 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) );

那可能吗??

4

1 回答 1

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));
于 2012-07-26T23:31:56.617 回答