首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用临时接口获取属性的类型

使用临时接口获取属性的类型
EN

Stack Overflow用户
提问于 2013-09-03 10:34:27
回答 1查看 676关注 0票数 1

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

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

无论如何,这不是问题所在,因为它主要起作用,至少它对简单成员、字符串、日期、bools等都很有效。棘手的部分是管理具有多个字段(如Address对象)的成员。

一种解决方案是使用反射来设置我们从表单post中获得的域的值,但是当然,这有它的开销,而且我被驱使去寻找一种更好的方法来做事情;在我的研究中,我发现了“临时界面”项目,它承诺在反射的基础上增加很多速度,但是我有一个简单的问题。

获得和设置属性是很好的,而且是好的:

代码语言:javascript
复制
var val = Impromptu.InvokeGet(domain, "fieldName");
Impromptu.InvokeSet(domain, "fieldName", value);

但我需要做的是找到财产的类型。到目前为止,我仍然只能看到如何通过反思来做到这一点:

代码语言:javascript
复制
PropertyInfo pi = domain.GetType().GetProperty("Name", BindingFlags.IgnoreCase | BindingFlags.Public | BindingFlags.Instance);
if (pi.GetValue(domain) is IMyInterface)
{
   // ? profit
}

那么:有没有可能临时做这件事呢?我需要将该属性转换为我的Interface,因为它有将html表单posts转换为我的EF对象的成员。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-09-03 13:00:41

您要问的一般问题是,我可以使用ImpromptuInterface查询属性类型吗?答案是否定的,DLR没有这个功能,反射就是这样。

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

代码语言:javascript
复制
var val = Impromptu.InvokeGet(domain, "fieldName");
if(val is IMyInterface){
    // ? profit
}

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18590050

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档