C# C-使用反射在成员类中获取属性

C# C-使用反射在成员类中获取属性,c#,.net,asp.net-mvc,reflection,asp.net-mvc-3,C#,.net,Asp.net Mvc,Reflection,Asp.net Mvc 3,短版 使用反射来转换字符串prop=part1.first\u name;输入System.Reflection.PropertyInfo,以便使用GetValue和SetValue函数 长版本 我正在使用ASP.NETMVC为我的组织构建一份调查问卷。它很长,所以分成了好几页。因为我们经常会收到这样的请求,比如,你能把这个问题移到那个页面,把另一个问题移到另一个页面吗?我需要把这个问题建立得非常灵活,让初级程序员可以修改 我的模型是一个复杂的类,它有五个成员类,其中大部分都有基本类型的属性 所

短版

使用反射来转换字符串prop=part1.first\u name;输入System.Reflection.PropertyInfo,以便使用GetValue和SetValue函数

长版本

我正在使用ASP.NETMVC为我的组织构建一份调查问卷。它很长,所以分成了好几页。因为我们经常会收到这样的请求,比如,你能把这个问题移到那个页面,把另一个问题移到另一个页面吗?我需要把这个问题建立得非常灵活,让初级程序员可以修改

我的模型是一个复杂的类,它有五个成员类,其中大部分都有基本类型的属性

所以,我通过Model.part1.first_name或Model.part2.birth_date这样的操作来访问它

由于所有页面都使用相同的模型,但并非所有问题都出现在每一页上,我有ActionAttributes,它基本上清除了表单上提交的所有属性,但页面上显示的属性除外,这样就不能向表单中插入隐藏字段并将值持久化到数据库中

我希望确保只保存有效的字段值,并且在当前页面完全正常之前不允许用户进入下一页,但我还希望保存有效的值,即使不允许用户继续

为此,我有一个函数,该函数接受我的模型类的两个实例,一个对ModelStateDictionary的引用,以及一个字段名的字符串[],如part1.first_name和part2.birth_date。该函数需要将字符串数组中列出的所有没有验证错误的值从第一个ie form submitted对象复制到从db对象加载的第二个ie中

如上所述,使用反射将part1.first_name之类的内容转换为System.reflection.PropertyInfo的最佳方法是什么?或者,有没有更好的方法来实现这一点

var infoParts = prop.Split('.');
var myType = Type.GetType(infoParts[0]);
var myPropertyInfo = myType.GetProperty(infoParts[1]);

假设part1是您的类型。尽管这是非常有限的,并且非常依赖于字符串的正确格式和当前范围内的类型。

我可能会使用数据以不同的方式处理此问题。我会在数据库中保存每个问题所属的步骤。要呈现该步骤,我将选择与该步骤匹配的问题,并创建一个包含问题id/问题对列表的模型。每个输入都将在发回时由问题id标识。要进行验证,只需将问题ID集与该步骤的预期ID进行比较。这样,要更改哪个问题在哪个步骤中进行,只需更改数据库中的数据

如果你真的走上了这条路,你需要把字符串分成几个部分,然后在每一步递归或迭代地找到对象上的属性

PropertyInfo property = null;
Type type = questionModel.GetType();
object value = questionModel;
object previousObj = null;
foreach (var part in questionId.Split('.'))
{
    property = type.GetProperty(part);
    previousObj = value;
    value = property.GetValue(value,null);
    type = value.GetType();
}
// here, if all goes well, property should contain the correct PropertyInfo and
// value should contain that property's value...and previousObj should contain
// the object that the property references, without which it won't do you much good.

我真的在考虑走那条路。问题是这个问题的用户界面千差万别。有些是简单的下拉列表,有些是/否,有些是依赖项,如果是,则选择其中一个选项…,等等@Ryan-嗯,这是一个挑战,但也许您可以使用具有特定模型显示模板的每个问题类型的子类化来处理问题类型,包括带有嵌套问题的问题。