我有一个复杂的解决方案,其中一部分问题是将模型从HTML绑定到一系列数据库支持的、相对复杂的实体框架DbSets。
问题是,我们有一个EF定义的域模型,它封装了我们需要知道的关于我们正在捕获的数据的所有信息;但是项目的管理员希望能够建立一个类似于问卷的表单,允许他们选择这个领域的任何成员。
无论如何,这不是问题所在,因为它主要起作用,至少它对简单成员、字符串、日期、bools等都很有效。棘手的部分是管理具有多个字段(如Address对象)的成员。
一种解决方案是使用反射来设置我们从表单post中获得的域的值,但是当然,这有它的开销,而且我被驱使去寻找一种更好的方法来做事情;在我的研究中,我发现了“临时界面”项目,它承诺在反射的基础上增加很多速度,但是我有一个简单的问题。
获得和设置属性是很好的,而且是好的:
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
}那么:有没有可能临时做这件事呢?我需要将该属性转换为我的Interface,因为它有将html表单posts转换为我的EF对象的成员。
发布于 2013-09-03 13:00:41
您要问的一般问题是,我可以使用ImpromptuInterface查询属性类型吗?答案是否定的,DLR没有这个功能,反射就是这样。
但是,您给出的使用反射的示例不是测试属性类型,而是测试值的运行时类型,这样它仍然可以在没有反射的情况下临时工作。
var val = Impromptu.InvokeGet(domain, "fieldName");
if(val is IMyInterface){
// ? profit
}另外,如果您只想要属性,请查看FastMember。它根据对象类型选择最快的访问机制。
https://stackoverflow.com/questions/18590050
复制相似问题