我有一个复杂的解决方案,其中部分问题是从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对象的成员。
答案 0 :(得分:1)
你问的一般问题,我可以使用ImpromptuInterface来查询属性类型,答案是否定的,DLR没有该函数,反射就是它。
但是,您使用反射提供的示例不是测试属性类型,而是测试值的运行时类型,以便在没有反射的情况下仍可使用Impromptu。
var val = Impromptu.InvokeGet(domain, "fieldName");
if(val is IMyInterface){
// ? profit
}
此外,如果您只想查看FastMember属性。它根据对象的类型选择最快的访问机制。