1

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

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

无论如何,这不是问题本身,因为它在很大程度上是有效的,至少它对于简单的成员、字符串、日期、布尔值等非常有效。棘手的部分是管理具有多个字段的成员,例如地址对象。

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

获取和设置属性都很好:

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

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

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

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

4

1 回答 1

1

你问的一般问题,能不能用ImpromptuInterface来查询属性类型,答案是否定的,DLR没有这个功能,反射就是。

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

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

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

于 2013-09-03T13:00:41.260 回答