Лучший подход, чтобы держать различные классы как собственность

2

Я, вероятно, не знаю правильную терминологию, чтобы искать это в Google, поэтому я спрашиваю здесь.

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

public class AnalysisQuery
{
    public string QueryName { get; set; }
    public string QueryDescription { get; set; }
    public string QuerySQL { get; set; }

    public T QueryParameters { get; set; } // <-- Not sure how to do this
}

и сказать, что у меня есть 2 совершенно разные классы, которые содержат параметры для конкретного запроса

public class EmployeeQueryParameters
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Occupation { get; set; }
    public DateTime StartingDate { get; set; }
    public bool IsMarried { get; set; }
}

public class CarQueryParameters
{
    public string CarName { get; set; }
    public string CarModel { get; set; }
    public string CarMaker { get; set; }
    public bool IsDiesel { get; set; }
}

Как мне хранить эти разные классы в свойстве QueryParameters?

Каков наилучший способ сделать это?

В конечном счете мне нужно использовать EmployeeQueryParameters или CarQueryParameters для источника данных, например

someControl.DataSource = new EmployeeQueryParameters()
{
    FirstName = "",
    LastName = "",
    Occupation = "",
    StartingDate = new DateTime(2018, 10, 18),
    IsMarried = true
};

Что я пробовал до сих пор....

1) Я посмотрел на интерфейсы, но похоже, что это будет работать, только если все свойства одинаковы в каждом классе EmployeeQueryParameters и CarQueryParameters.

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

public class AnalysisQuery
{
    public string QueryName { get; set; }
    public string QueryDescription { get; set; }
    public string QuerySQL { get; set; }
    public Parameter QueryParameters { get; set; }

    public AnalysisQuery()
    {
        QueryName = "QueryName1";
        QueryDescription = "QueryDescription1";
        QuerySQL = "QuerySQL1";
        QueryParameters = Parameter.Create<EmployeeQueryParameters>( 
                     new EmployeeQueryParameters() { FirstName = "first name" });
    }
}

все еще требует, чтобы тип был известен, чтобы получить значение, так что он побеждает объект использования универсального параметра?

        var analysisQuery = new AnalysisQuery();
        EmployeeQueryParameters parameters = 
            analysisQuery.QueryParameters.Get<EmployeeQueryParameters>();
  • 0
    У классов нет особых свойств, да? Decalre просто на свойство типа object !
Теги:

1 ответ

0

Ответ во многом зависит от вашего интерфейса. Есть ли у вас форма, которая использует AnalysisQuery в качестве модели, в которой вы динамически добавляете новые пары ключ-значение для определения параметров запроса? Тогда я рекомендую использовать словарь для QueryParameters. Используете ли вы только ограниченное количество предопределенных типов запросов, тогда я рекомендую использовать AnalysisQuery в качестве модели, которую затем переключать на основе раскрывающегося списка или списка переключателей и т.д. Еще больше, если ваш пользовательский интерфейс не знает (или не должен). t) список предопределенных типов, тогда вам нужно будет создать пользовательский интерфейс на основе фактического типа и значений объекта в QueryParameters, и в этом случае вы можете просто объявить его как объект и получить информацию с помощью отражения.

Итог, ваш вопрос слишком расплывчат для четкого ответа.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню