Проверка, содержит ли параметр объекта дату и время

У меня есть метод с параметром объекта, чтобы его можно было использовать по-разному разными методами вызова. Внутри метода мне нужно проверить, является ли первый параметр объекта датой или нет, если не установлена ​​сегодняшняя дата.

public void CreateNew(FileModel data, Object otherParams = null)
{
     DateTime portDate = DateTime.Now;
     if (otherParams is DateTime)
         portDate = (DateTime)otherParams;

    //In case 1 portDate is portDate value and in case 2 portDate value id 
    //DateTime.Now() even though portDate contains a value.
}

Я передаю объект этому методу в форме двумя способами, как показано ниже.

CreateNew(fileData,new {portDate=portDate});
CreateNew(fileData,new {portDate=portDate,countries=countries});

Приведенный выше код работает в первом случае, но не работает во втором случае, а portDate всегда является сегодняшней датой. Итак, как я могу иметь общий случай проверки даты для правильной обработки обоих случаев?

Я чувствую, что вы злоупотребляете анонимными типами С#. Почему бы вместо этого не использовать строго типизированный параметр кортежа?

Dai 10.04.2019 21:48

Я рекомендую не использовать методы, написанные для использования иначе, чем разные методы вызова. Если otherParams может быть разными вещами, как кто-нибудь узнает, что это может быть? Если вы опубликуете пример некоторых из различных вариантов на https://softwareengineering.stackexchange.com/, тогда могут быть некоторые предложения о том, какие части можно повторно использовать и комбинировать, а какие оставить полностью отдельными. Потому что объединение для уменьшения дублирования — это хорошо, но не таким образом, чтобы сделать намерения неясными.

Scott Hannen 10.04.2019 21:53

@Dai Мое понимание может быть совершенно неправильным, но могу ли я использовать кортеж, если я не всегда уверен в количестве параметров? Потому что в случае 1 есть 1, в случае 2 есть 2, и у меня может быть случай, когда их 3.

TheFallenOne 10.04.2019 21:54

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

Ilya Chernomordik 10.04.2019 21:55

Это должно быть формализовано как разные сигнатуры методов.

user47589 10.04.2019 21:56
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
5
882
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Вы можете использовать dynamic вместо Object, а затем проверить

if (otherParams?.portDate is DateTime)
{ ...}

Хотя я согласен с комментарием о том, что вы, кажется, неправильно используете анонимные классы. Если вы знаете, что получаете, просто создайте настоящий класс, в котором будет DateTime portDate, чтобы вы знали наверняка.

вы можете увидеть все свойства объекта и проверить, является ли одно из них датой и временем

    object example  = new {si= DateTime.Now, no= "no"}; //object example

    var typevar  = example.GetType().GetProperties(); //get all te props
    //lets loop all the props
    foreach(var i in typevar){
       if (i.PropertyType == typeof(System.DateTime)){
         //if is DateTime well write the name of prop with i.Name 
         Console.WriteLine("The propiertie {0} is date time", i.Name);
       }
    }

это также работает для динамических параметров

Ваш вопрос указывает на то, что если otherParams не является DateTime, вы будете использовать DateTime.Now. Это говорит о том, что если otherParams не является DateTime, то оно не используется.

Если это так, то лучшей подписью может быть:

public void CreateNew(FileModel data, DateTime? portDate = null)

Это дает понять вызывающему абоненту, что portDate должен быть DateTime, но это необязательно. Тогда вы можете сделать это:

portDate = portDate ?? DateTime.Now;

Так что, если он не имеет значения, он заменяется на DateTime.Now.

Если есть разные способы его вызова, вы можете предоставить разные перегрузки в зависимости от того, как его следует вызывать.

Вы также можете добавить:

public void CreateNew(FileModel data, Countries countries, DateTime? portDate = null)

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

Если что-то еще должно вызвать аналогичный метод, но второй параметр может быть совершенно другим (не датой), то лучше создать другой метод. Если тип параметра — object, и есть вероятность, что это может быть DateTime, и есть хотя бы один другой правильный тип, то у вызывающей стороны нет возможности узнать, что им следует передать. Например, они могут вызвать:

CreateNew(someFileModel, new List<string>());

... и он скомпилируется, но ваш метод не будет иметь для этого никакого смысла List<string> и может даже вызвать исключение. Безопасность типов очень ценна, потому что позволяет нам заранее все исправить. Код даже не скомпилируется, если мы не передаем правильный тип. Мы не хотим, чтобы наш код компилировался, а затем выдавал ошибку времени выполнения, если мы можем этого избежать.

В качестве общей рекомендации мы должны использовать object только в том случае, если тип действительно не имеет значения. Вы можете передавать объекты в String.Format, потому что в большинстве случаев он просто вызывает ToString(), поэтому тип не имеет значения. В 90% или более случаев (я бы сказал, ближе к 99,5%) имеет значение тип делает. Если мы попадаем в тупик и чувствуем, что нам нужно использовать dynamic или object, тогда мы должны сделать шаг назад и попытаться стереть себя с этого угла.

Другие вопросы по теме