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