Перадача радавога аб'екта і вырашыць, што для запаўнення ў <асіны: Label>

I have an I wish to populate depending on the Generic object that I pass to it.

На дадзены момант у мяне ёсць наступны код: -

    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 item)
    {
        lblQuestionTitle.Text = typeof (T) == typeof (ReportQuestion)
                                    ? ((ReportQuestion) (item)).ReportQuestionTitle
                                    : ((ReportQuestionTranslation) (item)).ReportQuestionTitleTrans; 
    }

Як я магу атрымаць метад PopulateLabels працаваць правільна?

1
Што менавіта адбываецца не так з вашым PopulateLabels метад цяпер?
дададзена аўтар mclark1129, крыніца
Што менавіта адбываецца не так з вашым PopulateLabels метад цяпер?
дададзена аўтар mclark1129, крыніца
ды гэта правільна. Пылавікі спосабам было б зрабіць Умоўны яшчэ і праверыць культуру, або перамыкач
дададзена аўтар Johann, крыніца
@StephenKennedy як перавызначыць і паставіць ToString (? ReportQuestion і ReportQuestionTranslation маюць розныя поля, таму я не магу рэалізаваць інтэрфейс не?
дададзена аўтар Johann, крыніца
@StephenKennedy ці ёсць іншы спосаб, а не з дапамогай інтэрфейсу? Я не хачу, каб змяніць ужо існуючы код
дададзена аўтар Johann, крыніца
@StephenKennedy ці ёсць іншы спосаб, а не з дапамогай інтэрфейсу? Я не хачу, каб змяніць ужо існуючы код
дададзена аўтар Johann, крыніца
@StephenKennedy як перавызначыць і паставіць ToString (? ReportQuestion і ReportQuestionTranslation маюць розныя поля, таму я не магу рэалізаваць інтэрфейс не?
дададзена аўтар Johann, крыніца
ды гэта правільна. Пылавікі спосабам было б зрабіць Умоўны яшчэ і праверыць культуру, або перамыкач
дададзена аўтар Johann, крыніца
@StephenKennedy - Што, калі ён павінен паставіць гэтае пытанне тут, але дзе-то ён павінен пакласці адказ ад таго ж аб'екта. Калі ToString быць пытанне альбо адказ? Калі вы рэалізуеце інтэрфейс, вы можаце мець як ... з ToString (), вы можаце мець толькі адзін выкарыстоўваць для класа. Інтэрфейсы стварыць больш гнуткую канструкцыю.
дададзена аўтар Kevin Nelson, крыніца
@StephenKennedy - Што, калі ён павінен паставіць гэтае пытанне тут, але дзе-то ён павінен пакласці адказ ад таго ж аб'екта. Калі ToString быць пытанне альбо адказ? Калі вы рэалізуеце інтэрфейс, вы можаце мець як ... з ToString (), вы можаце мець толькі адзін выкарыстоўваць для класа. Інтэрфейсы стварыць больш гнуткую канструкцыю.
дададзена аўтар Kevin Nelson, крыніца
Кожны кажа выкарыстоўваць інтэрфейс, але кожны клас спадчыну ад аб'екта і рэалізуе ToString. Што здарылася з пераазначэнне і з дапамогай ToString ()?
дададзена аўтар Stephen Kennedy, крыніца
Кожны кажа выкарыстоўваць інтэрфейс, але кожны клас спадчыну ад аб'екта і рэалізуе ToString. Што здарылася з пераазначэнне і з дапамогай ToString ()?
дададзена аўтар Stephen Kennedy, крыніца
Так, вы можаце рэалізаваць інтэрфейс з тэкставай радком загалоўка - напрыклад, Адказ csharpler - або, калі мець на ўвазе перасцярог Кевіна можна перавызначыць ToString у кожным класе.
дададзена аўтар Stephen Kennedy, крыніца
Так, вы можаце рэалізаваць інтэрфейс з тэкставай радком загалоўка - напрыклад, Адказ csharpler - або, калі мець на ўвазе перасцярог Кевіна можна перавызначыць ToString у кожным класе.
дададзена аўтар Stephen Kennedy, крыніца
У любым выпадку запатрабуе змены класаў. Тэкст зыходзіць з ReportQuestionTranslation.ReportQuestionTitleTrans або ReportQuestion.ReportQuestionTitle, праўда?
дададзена аўтар Stephen Kennedy, крыніца
У любым выпадку запатрабуе змены класаў. Тэкст зыходзіць з ReportQuestionTranslation.ReportQuestionTitleTrans або ReportQuestion.ReportQuestionTitle, праўда?
дададзена аўтар Stephen Kennedy, крыніца
Я паклаў адказ у пра тое, як перавызначыць метад ToString (). Затым вы проста тэлефануйце ToString() на аб'екце, незалежна ад тыпу. Гэта, вядома, скампіляваць з-за спадчыну ад Object.ToString (). НТН.
дададзена аўтар Stephen Kennedy, крыніца
Я паклаў адказ у пра тое, як перавызначыць метад ToString (). Затым вы проста тэлефануйце ToString() на аб'екце, незалежна ад тыпу. Гэта, вядома, скампіляваць з-за спадчыну ад Object.ToString (). НТН.
дададзена аўтар Stephen Kennedy, крыніца

6 адказы

Вы павінны выкарыстоўваць інтэрфейс як ReportQuestion і ReportQuestionTranslation рэалізацыі:

interface IQuestion
{
    string TitleText;
}

Затым, выкарыстоўвайце наступны код:

public void PopulateLabels(IQuestion item)
{
    lblQuestionTitle.Text = item.TitleText;
}
5
дададзена
@csharpler, як я магу мець інтэрфейс, калі ReportQuestion і ReportQuestion перакладзены маюць розныя поля?
дададзена аўтар Johann, крыніца
<�Код> грамадскага несапраўдны PopulateLabels (IQuestion пытанне)
дададзена аўтар Jay, крыніца
@Jay права, што прасцей
дададзена аўтар pascalhein, крыніца
Вы павінны рэалізаваць інтэрфейс у кожным класе, вяртаючы адпаведнае ўласцівасць або поле або пераменны для гэтага канкрэтнага класа.
дададзена аўтар Stephen Kennedy, крыніца

Вы павінны выкарыстоўваць інтэрфейс як ReportQuestion і ReportQuestionTranslation рэалізацыі:

interface IQuestion
{
    string TitleText;
}

Затым, выкарыстоўвайце наступны код:

public void PopulateLabels(IQuestion item)
{
    lblQuestionTitle.Text = item.TitleText;
}
5
дададзена
@csharpler, як я магу мець інтэрфейс, калі ReportQuestion і ReportQuestion перакладзены маюць розныя поля?
дададзена аўтар Johann, крыніца
<�Код> грамадскага несапраўдны PopulateLabels (IQuestion пытанне)
дададзена аўтар Jay, крыніца
@Jay права, што прасцей
дададзена аўтар pascalhein, крыніца
Вы павінны рэалізаваць інтэрфейс у кожным класе, вяртаючы адпаведнае ўласцівасць або поле або пераменны для гэтага канкрэтнага класа.
дададзена аўтар Stephen Kennedy, крыніца

Выкарыстоўвайце інтэрфейс .

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

Unrecommended:

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);
}
3
дададзена
Я ўжо адправіў праўку. Вам неабходна альбо выкарыстоўваць адлюстраванне для вызначэння тыпаў або проста іншы метад для кожнага тыпу.
дададзена аўтар Romoku, крыніца
Інтэрфейсы рэкамендуемы спосаб стварыць чыстую іерархію. Калі вы не звязаныя з перадавой практыкай, то вы маглі б проста выкарыстоўваць тыпы. Джынэрыкі не патрэбныя ў гэтай кропцы, бо няма нічога, каб стварыць адносіны паміж класамі.
дададзена аўтар Romoku, крыніца
Дзякуючы Romoku, я буду правяраць, калі я магу змяніць любы ўжо існуючы код для рэалізацыі на прыкладзе класа
дададзена аўтар Johann, крыніца
Так, я згодны, што інтэрфейсы з'яўляюцца шляхам, аднак я не хачу змяняць ужо існуючыя класы. Іншы шлях быў бы зрабіць простае заяву перамыкача
дададзена аўтар Johann, крыніца
Ці ёсць іншы спосаб, чым з дапамогай інтэрфейсу? Я павінен змяніць ужо існуючы код, калі я павінен рэалізаваць інтэрфейс. Я не магу зрабіць гэта з тыпамі?
дададзена аўтар Johann, крыніца

Выкарыстоўвайце інтэрфейс .

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

Unrecommended:

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);
}
3
дададзена
Я ўжо адправіў праўку. Вам неабходна альбо выкарыстоўваць адлюстраванне для вызначэння тыпаў або проста іншы метад для кожнага тыпу.
дададзена аўтар Romoku, крыніца
Інтэрфейсы рэкамендуемы спосаб стварыць чыстую іерархію. Калі вы не звязаныя з перадавой практыкай, то вы маглі б проста выкарыстоўваць тыпы. Джынэрыкі не патрэбныя ў гэтай кропцы, бо няма нічога, каб стварыць адносіны паміж класамі.
дададзена аўтар Romoku, крыніца
Дзякуючы Romoku, я буду правяраць, калі я магу змяніць любы ўжо існуючы код для рэалізацыі на прыкладзе класа
дададзена аўтар Johann, крыніца
Так, я згодны, што інтэрфейсы з'яўляюцца шляхам, аднак я не хачу змяняць ужо існуючыя класы. Іншы шлях быў бы зрабіць простае заяву перамыкача
дададзена аўтар Johann, крыніца
Ці ёсць іншы спосаб, чым з дапамогай інтэрфейсу? Я павінен змяніць ужо існуючы код, калі я павінен рэалізаваць інтэрфейс. Я не магу зрабіць гэта з тыпамі?
дададзена аўтар Johann, крыніца

Падыход ToString() будзе нешта накшталт гэтага:

class ReportQuestion {
    public override string ToString() { return ReportQuestionTitle; }
    ...
}

class ReportQuestionTranslation{
    public override string ToString() { return ReportQuestionTitleTrans; }
    ...
}

калі выказаць здагадку, што я адказаў на мой уласны пытанне правільна ў каментарах вышэй пытацца, дзе радок будзе паступаць з.

1
дададзена
Ён сказаў, што ён не хоча, каб змяніць ужо існуючы код, які сьмярдзіць.
дададзена аўтар Romoku, крыніца
Дзякуй за вашу дапамогу Стывена, ды я згодны, што абодва клас павінен рэалізоўваць інтэрфейс пытання. Ўбачыце, які падыход можна рэалізаваць.
дададзена аўтар Johann, крыніца
Дзякуючы Стывен, ды гэта будзе змяніць клас да гэтага часу. Я буду правяраць, ці магу я змяніць якія-небудзь ужо існуючыя класы, паколькі прыклад інтэрфейсу нашмат больш стандартнага я згодны.
дададзена аўтар Johann, крыніца
Чым больш я гляджу на яго больш схільнымі я таксама павінен быў бы пайсці з інтэрфейсам або абстрактным (базавы) клас, як канцэптуальна Справаздача Пытанне перакладу «з'яўляецца» Справаздача Пытанне. Такі падыход, аднак, дотык прасцей. У любым выпадку ўдачы.
дададзена аўтар Stephen Kennedy, крыніца
Сардэчна запрашаем Ёган.
дададзена аўтар Stephen Kennedy, крыніца
Так, я бачыў гэта, але ён прыціскаў мяне для атрымання дадатковай інфармацыі аб маршруце ToString (), і я рады дапамагчы. Калі гэта дапамагае :)
дададзена аўтар Stephen Kennedy, крыніца

Вы можаце проста перавызначыць ToString() на гэтых аб'ектах і не турбавацца аб якіх-небудзь пераўтварэнняў або тыпаў у PopulateLabel.

0
дададзена
як ты гэта робіш?
дададзена аўтар Johann, крыніца
У вызначэнні кожнага адпаведнага класа, дадайце метад грамадскага пераазначэння радкі ToString() - гл адказ StephenKennedy ў ніжэй больш падрабязна.
дададзена аўтар Deeko, крыніца