Динамически присваивать свойство списка [duplicate]

Это сводило меня с ума, ища простой ответ. Наконец, я сделал эту функцию, которая, кажется, улавливает все данные и дает хорошую строку SQL, которая является правильной или, по крайней мере, действительной и проверяемой. Если это 1999-12-31, это, вероятно, неверно, но не приведет к ошибке в MySQL.

function MakeSQLDate($date) {
    if (is_null($date)) {
        //use 1999-12-31 as a valid date or as an alert
        return date('Y-m-d', strtotime('1999-12-31'));
    }

    if (($t = strtotime($date)) === false) {
        //use 1999-12-31 as a valid date or as an alert
        return date('Y-m-d', strtotime('1999-12-31'));
    } else {
        return date('Y-m-d H:i:s', strtotime($date));
    }
}
5
задан Tim 25 June 2013 в 20:14
поделиться

1 ответ

Метод, который установит свойство с заданным именем:

    public void SetProperty(String propertyName, object value)
    {
        this.GetType().GetProperty(propertyName).SetValue(this, value);
    }

Несколько вещей о реализации:

  • Используемый тип - это динамический фактический тип объект, который найдет элементы, которые находятся в производных классах (до тех пор, пока объект имеет производный тип курса).
  • Информация о свойствах не имеет представления о том, из какого объекта она появилась, поэтому this необходимо снова передать в вызов SetValue().

Вторая часть вашего вопроса, чтобы перебирать список свойств, может быть решена с помощью GetProperties(), чтобы получить все свойства объекта, включая унаследованные:

var properties = this.GetType().GetProperties();
10
ответ дан Anders Abel 20 August 2018 в 09:32
поделиться
  • 1
    Вы можете сделать это универсальное расширение, тогда вам не нужно вставлять этот метод в каждую иерархию классов. – Jay 25 June 2013 в 20:25
  • 2
    Спасибо Андерсу, за ваш ответ. Я считаю, что это будет работать для базового класса, но могу ли я установить значение PropertyC1, вызывающего этот метод в classA? – Tim 25 June 2013 в 20:26
  • 3
    @Jay: метод SetProperty должен быть членом базового класса. Не делайте это расширение - это сделает его доступным для большего количества мест. Это уродливо, так что давайте сохраним его только там, где это необходимо. – Anders Abel 25 June 2013 в 20:26
  • 4
    @Tim: Да, пока объект является экземпляром ClassC, он сможет установить PropertyC1, хотя метод определен в ClassA, потому что метод использует объекты фактический тип через this.GetType(), а не тип базового класса. – Anders Abel 25 June 2013 в 20:28
  • 5
    Я все еще думаю, что здесь лучше. Потому что теперь все классы должны унаследовать от одной и той же базы, что может быть нежелательно. Вы могли бы хотя бы создать интерфейс IPropertySetable и расширить его. – Jay 25 June 2013 в 20:32
Другие вопросы по тегам:

Похожие вопросы: