使用Impromptu-Interface获取属性的类型

时间:2013-09-03 10:34:27

标签: c# entity-framework impromptu-interface

我有一个复杂的解决方案,其中部分问题是从HTML表单到一系列数据库支持且相对复杂的Entity Framework DbSets的模型绑定。

问题是,我们有一个EF定义的域模型,它封装了我们需要知道的关于我们捕获的数据的所有内容;但该项目的管理员希望能够制作类似问卷的表格,允许他们选择该域名的任何成员。

无论如何,这不是问题,因为它在很大程度上起作用,至少它对于简单的成员,字符串,日期,bool等非常有效。棘手的部分是管理具有多个字段的成员,例如Address对象。

一个解决方案是使用Reflection来设置我们从表单帖子中收到的域的值,但当然这有其开销,我很想找到一个更好的方式做事;在我的研究中,我发现了“即兴界面”项目,该项目承诺比反射提高了很多,但我有一个简单的问题。

获取和设置属性一切都很好:

var val = Impromptu.InvokeGet(domain, "fieldName");
Impromptu.InvokeSet(domain, "fieldName", value);

但我需要做的是找到属性的类型。 到目前为止,我仍然只能看到如何使用Reflection:

PropertyInfo pi = domain.GetType().GetProperty("Name", BindingFlags.IgnoreCase | BindingFlags.Public | BindingFlags.Instance);
if (pi.GetValue(domain) is IMyInterface)
{
   // ? profit
}

所以:用Impromptu可以做到这一点吗? 我需要将属性转换为我的接口,因为它有将html表单帖子转换为我的EF对象的成员。

1 个答案:

答案 0 :(得分:1)

你问的一般问题,我可以使用ImpromptuInterface来查询属性类型,答案是否定的,DLR没有该函数,反射就是它。

但是,您使用反射提供的示例不是测试属性类型,而是测试值的运行时类型,以便在没有反射的情况下仍可使用Impromptu。

var val = Impromptu.InvokeGet(domain, "fieldName");
if(val is IMyInterface){
    // ? profit
}

此外,如果您只想查看FastMember属性。它根据对象的类型选择最快的访问机制。