我正在尝试找到一个问卷问题的简洁解决方案。假设我有一个Questionnaire
类有一个集合Answer
s, e.g.
public class Questionnaire
{
public virtual ISet<Answer> Answers {get;set;}
}
根据问题的不同,答案需要有不同的类型,例如出生日期、满分十分、你认为为什么等等。
我的第一个想法是这样的:
public class Question
{
public virtual QuestionType TypeOfQuestion {get;set;}
public virtual string PromptText {get;set;}
}
public class Answer
{
public virtual Question Question {get;set;}
}
public class DateTimeAnswer : Answer
{
public virtual DateTime Response {get;set;}
}
public class IntegerAnswer : Answer
{
public virtual int Response {get;set;}
}
// etc.
一个明显的问题是,从调查问卷中无法获得Response
财产:
questionnaire.Answers[0].Response; // compile error
这同样适用于接口。使用通用接口会更好,例如:
public interface IAnswer<T>
{
public virtual Question Question {get;set;}
public virtual T Response {get;set;}
}
public class DateTimeAnswer : IAnswer<DateTime> {}
那么问题就来了Questionnaire
类,因为必须提供 IAnswer 的类型:
public class Questionnaire
{
public virtual ISet<IAnswer<???>> Answers {get;set;}
}
显然,我不想拥有许多 IAnswer 集合,每个集合都有不同的类型。我可以用
ISet<IAnswer<dynamic>>
但 NHibernate 不会喜欢它。
我意识到某些地方需要妥协,但我不确定哪个是最漂亮的。你会怎么办?