Вы можете сделать это с помощью отражения без особых проблем, и я уверен, что к тому времени, когда я опубликую это, будут ответы, которые расскажут вам, как это сделать.
Но я лично не люблю вариант отражения.
Я предпочитаю поддерживать инварианты объектов для всех членов объекта с помощью различных средств. Для членов строки инвариант часто означает, что он не является нулевым, а иногда также требуются максимальные требования длины (например, для хранения в базе данных). Другие члены имеют другие виды инвариантов.
Первым шагом является создание метода, который проверяет все инварианты, которые вы определяете для объекта.
[Conditional("DEBUG")]
private void CheckObjectInvariant()
{
Debug.Assert(name != null);
Debug.Assert(name.Length <= nameMaxLength);
...
}
Тогда вы вызываете это после любого метода, который каким-либо образом манипулирует объектом. Поскольку он украшен ConditionalAttribute
, ни один из этих вызовов не появится в версии приложения.
Тогда вам просто нужно убедиться, что ни один из кодов не допускает каких-либо нарушений этих инвариантов. Это означает, что в строковых полях должны быть либо инициализаторы в своих объявлениях, либо они должны быть установлены во всех конструкторах для объекта.
Специальная проблема, которая, вероятно, мотивировала этот вопрос, заключается в том, что делать с автоматическими свойствами.
public string Name { get; set; }
Очевидно, что это может быть установлено в нуль в любое время, и вы ничего не можете с этим поделать.
Существует два варианта автоматического свойства. Во-первых, вы можете просто не использовать их вообще. Это полностью устраняет проблему. Во-вторых, вы можете просто разрешить любое возможное строковое значение. То есть любой код, который использует это свойство, должен ожидать нули, строки 10 мб или что-то среднее между ними.
Даже если вы используете опцию отражения для удаления нулей, вам все равно нужно знать, когда следует называть метод magic-null-remove на объекте, чтобы избежать NullReferenceException
, так что вы действительно ничего не купили.
Вы имеете в виду, что все свойства 'string'' объекта 'от' до 'String.Empty'? –
Любые значения «его»? Каков тип объекта, который вы хотите проверить? – Thomas