【发布时间】:2011-03-15 00:37:39
【问题描述】:
我正在尝试为问卷问题找到一个简洁的解决方案。假设我有一个 Questionnaire 类,其中包含 Answers 的集合,例如
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 不喜欢它。
我意识到某处需要妥协,但我不确定哪个是最漂亮的。你会怎么做?
【问题讨论】:
标签: c# nhibernate design-patterns collections interface