将Object元素的String版本与Object元素本身匹配

时间:2014-03-22 17:52:34

标签: c#

我有一个实例,我有一个类似于此的对象:

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;
    ....
};

我研究了几个小时并没有想出任何东西。非常感谢任何帮助。

2 个答案:

答案 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 ...";