动态创建c#语句

时间:2012-07-26 23:13:17

标签: asp.net asp.net-mvc c#-4.0

我正在尝试动态创建一个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));

这可能吗?

1 个答案:

答案 0 :(得分:1)

假设Entity_1SetXrm的公共属性,您可以使用反射:

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));