1

<asp:Label> 渡すジェネリックオブジェクトに応じて、入力したいがあります。

現時点では、次のコードがあります:-

    private void PopulateEnglishQuestion(int questionId)
    {
        ReportQuestion reportQuestion = questionsBll.GetReportQuestions().Where(x=> x.ReportQuestionId == questionId).FirstOrDefault();
        PopulateLabels(reportQuestion);
    }

    private void PopulateTranslatedQuesiton(int questionId)
    {
        ReportQuestionTranslation reportQuestionTranslation = questionsBll.GetReportQuestionsTranslation().Where(x => x.QuestionId == questionId).FirstOrDefault();
        PopulateLabels(reportQuestionTranslation);
    }

    private void PopulateLabels<T>(T item)
    {
        lblQuestionTitle.Text = typeof (T) == typeof (ReportQuestion)
                                    ? ((ReportQuestion) (item)).ReportQuestionTitle
                                    : ((ReportQuestionTranslation) (item)).ReportQuestionTitleTrans; 
    }

メソッド PopulateLabels を正しく機能させるにはどうすればよいですか?

4

4 に答える 4

5

インターフェイスを使用して実装する必要がありReportQuestionますReportQuestionTranslation

interface IQuestion
{
    string TitleText;
}

次に、次のコードを使用します。

public void PopulateLabels(IQuestion item)
{
    lblQuestionTitle.Text = item.TitleText;
}
于 2013-05-29T16:42:53.413 に答える
3

を使用しinterfaceます。

public interface IQuestion
{
    string Title { get; }
}

public class ReportQuestion : IQuestion
{
    public string Title { get { return ReportQuestionTitle; } }
}

public class ReportQuestionTranslation: IQuestion
{
    public string Title { get { return ReportQuestionTitleTrans; } }
}

private void PopulateLabels(IQuestion item)
{
    lblQuestionTitle.Text = item.Title;
}

または、メソッドのオーバーロードを使用します。

public void PopulateTitle(ReportQuestion question)
{
    lblQuestionTitle.Text = question.ReportQuestionTitle;
}

public void PopulateTitle(ReportQuestionTranslation question)
{
    lblQuestionTitle.Text = question.ReportQuestionTitleTrans;
}

非推奨:

public class QuestionTitleFormatter
{
    public string GetTitle(object question)
    {
        if(question is ReportQuestion)
            return ((ReportQuestion)question).ReportQuestionTitle;

        if(question is ReportQuestionTranslation)
            return ((ReportQuestionTranslation)question).ReportQuestionTitleTrans;

        throw new NotImplementedException(string.Format("{0} is not supported", questionType.Name);
    }
}

public void PopulateTitle(object question)
{
    var formatter = new QuestionTitleFormatter();
    lblQuestionTitle.Text = formatter.GetTitle(question);
}
于 2013-05-29T16:44:47.730 に答える
0

これらのオブジェクトで ToString() をオーバーライドするだけで、PopulateLabel の変換や型について心配する必要はありません。

于 2013-05-29T16:50:43.987 に答える