我有一个实例,我有一个类似于此的对象:
public class answerObject
{
public string Q1 { get; set; }
public string Q2 { get; set; }
public string Q3 { get; set; }
public string Q4 { get; set; }
public string Q5 { get; set; }
...
public string Q80 { get; set; }
}
问题本身如下:
public class questionObject
{
public string DataMember { get; set; }
...
}
DataMember字符串包含答案对象元素的字符串版本。所以,如果我有问题1有一个数据库“Q1”,那么我希望它填写answerObject.Q1,依此类推。现在我有一个冗长的switch语句来解决这个问题,但必须有一个更有效的方法来做到这一点。
switch(DataMember) {
case "Q1":
answerObject.Q1 = answerValue;
break;
case "Q2":
answerObject.Q2 = answerValue;
break;
....
};
我研究了几个小时并没有想出任何东西。非常感谢任何帮助。
答案 0 :(得分:1)
您可以使用Reflection
但我会继续使用:switch/case
var property = typeof(answerObject).GetProperty(DataMember);
if(property != null) property.SetValue(yourInstance, answerValue);
使用Reflection
进行编辑后更有意义。无论如何,您还可以将此代码放入扩展方法中:
public static void SetAnswer(this answerObject instance, string question, string value)
{
var property = typeof(answerObject).GetProperty(question);
if (property != null) property.SetValue(instance, value);
else { // throw exception or display a message }
}
答案 1 :(得分:1)
一种可能的解决方案是使用Dictionary对象 - 将问题设为字典并设置字符串 Q1 , Q2 等等作为键(您的DataMember
稍后将填充其中一个键)。然后分配问题只需使用已设置的 DataMember 和item property of the Dictionary object。代码可能如下所示:
public class QuestionObject
{
public string DataMember { get; set; }
public String Answer { get; set; }
}
public class AnswerObject
{
public Dictionary<String, String> Questions { get; set; }
public AnswerObject()
{
Questions = new Dictionary<String, String>();
// init the question keys
Enumerable.Range(1, 80).ToList().ForEach(index =>
{
Questions.Add(String.Format("Q{0}", index), String.Empty);
});
}
}
用法如下:
var question = new QuestionObject();
var answer = new AnswerObject();
question.DataMember = @"Q75";
// set the question = the same as the switch/case
answer.Questions[question.DataMember] = @"and the answer is ...";