Это сводило меня с ума, ища простой ответ. Наконец, я сделал эту функцию, которая, кажется, улавливает все данные и дает хорошую строку 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));
}
}
Метод, который установит свойство с заданным именем:
public void SetProperty(String propertyName, object value)
{
this.GetType().GetProperty(propertyName).SetValue(this, value);
}
Несколько вещей о реализации:
this
необходимо снова передать в вызов SetValue()
. Вторая часть вашего вопроса, чтобы перебирать список свойств, может быть решена с помощью GetProperties()
, чтобы получить все свойства объекта, включая унаследованные:
var properties = this.GetType().GetProperties();
SetProperty
должен быть членом базового класса. Не делайте это расширение - это сделает его доступным для большего количества мест. Это уродливо, так что давайте сохраним его только там, где это необходимо. – Anders Abel 25 June 2013 в 20:26ClassC
, он сможет установитьPropertyC1
, хотя метод определен вClassA
, потому что метод использует объекты фактический тип i> черезthis.GetType()
, а не тип базового класса. – Anders Abel 25 June 2013 в 20:28IPropertySetable
и расширить его. – Jay 25 June 2013 в 20:32