C # статический класс и данные членов вопрос - PullRequest
0 голосов
/ 18 марта 2011

Я не уверен, как реализовать то, что я имею в виду, используя C # .Net 3.5.У меня есть статический класс с именем Common, который содержит общие методы.Одним из методов является PrepareReportParameters.Этот метод принимает строку ReportParams и анализирует ее, чтобы получить значения параметров.Я загружаю эту строку ReportParams в словарь.И затем проверьте, существуют ли требуемые элементы.Я проверяю это следующим образом:

if (ReportParamList.ContainsKey("PAccount"))
{
    ReportParamList.TryGetValue("PAccount", out PrimaryAccount);
}

, где PrimaryAccount является статической переменной в моем классе Common.И я могу получить доступ к этому в другом месте как Common.PrimaryAccount.

Хотя этот подход к доступу к параметрам отчета будет работать, но я хочу, чтобы PrimaryAccount был доступен как Common.ReportParameters.PrimaryAccount.Вот проблема, я не знаю, какой тип ReportParameters должен быть и как я могу добавить все параметры отчета, добавленные к этому типу?Как мне определить ReportParameters?Звучит ли это осуществимым или не имеет никакого смысла.Пожалуйста, ПОМОГИТЕ!

Ответы [ 3 ]

4 голосов
/ 18 марта 2011

Похоже, вы в основном привыкли использовать глобальные переменные для передачи состояния. Это вообще очень плохая идея.

Почему ваш метод не возвращает значение основного счета? Затем это можно передать другим вещам, которые в этом нуждаются.

Если вы обнаружите, что у вас много статических членов - и, в частности, если другие классы извлекают изменяемые статические переменные - подумайте, можно ли применить более внеплановый дизайн. Это будет легче понять, легче тестировать и легче поддерживать.

РЕДАКТИРОВАТЬ: Хорошо, так что в настоящее время у вас есть:

public static class Common
{
    public static int PrimaryAccount;
    // other static fields

    public static void PrepareReportParameters(string reportParameters)
    {
        // Code to set the fields
    }
}

Вместо этого используйте обычный класс:

public class ReportParameters
{
    public int PrimaryAccount { get; private set; }
    // Other properties

    private ReportParameters(int primaryAccount, ....)
    {
        this.PrimaryAccount = primaryAccount;
    }

    // Could use a constructor instead, but I prefer methods when they're going to
    // do work
    public static ReportParameters Parse(string report)
    {
        // Parse the parameter, save values into local variables, then
        return new ReportParameters(primaryAccount, ...);
    }
}

Затем вызовите это из остальной части вашего кода и передайте ссылку ReportParameters на все, что ему нужно.

1 голос
/ 18 марта 2011

Вы можете создать класс ReportParameters с соответствующими строго типизированными свойствами и дать Common его статический экземпляр?

0 голосов
/ 18 марта 2011

Я не уверен, что это лучший дизайн.Существует определенное количество «запаха кода», имеющего Common.PrimaryAccount, доступ к которому возможен только после вызова PrepareReportParameters.Может быть, вы рассматриваете класс экземпляра, передавая параметры в конструкторе?

...