Обновление:
Теперь я понимаю, что вы пытаетесь сделать. У вас есть куча переменных, и вы хотите выполнить какую-то массовую операцию над ними, ничего не меняя. Поместить их в класс не вариант.
В этом случае вы действительно застряли, работая с ними по одному. Есть способы сократить его, но вы в значительной степени застряли с повторением.
Я бы
- создал бы
string SanitizeString(string input)
функцию - type
x = SanitizeString(x);
один раз для каждой переменной - скопируйте и вставьте имена переменных, чтобы заменить
x
.
Это плохо, но это почти все, что есть.
Возможно, это был бы лучший подход. Это гарантирует, что значения всегда очищаются. В противном случае вы не можете легко определить, были ли значения очищены или нет:
public class MyValues
{
private string _value1;
private string _value2;
private string _value3;
public string Value1
{
get { return _value1; }
set { _value1 = Sanitize(value); }
}
// repeat for other values
private string Sanitize(string input) =>
string.IsNullOrEmpty(input) || string.Equals("Blank", input) ? null : input;
}
Это один из вариантов. Другой - дезинфицировать входные данные ранее. Но в идеале мы хотим убедиться, что данный класс всегда находится в допустимом состоянии. Мы бы не хотели иметь экземпляр класса, независимо от того, допустимы ли значения или нет. Лучше убедиться, что они всегда действительны.
ref
на самом деле не учитывает это. Нам не нужно использовать его часто, если вообще. С типом значения или string
мы можем просто вернуть новое значение из функции.
Если мы передаем ссылочный тип и хотим внести в него изменения (например, установить его свойства, добавить элементы в список), тогда мы уже передаем ссылку, и нам не нужно указывать ref
.
Сначала я попытаюсь написать методы, не используя ref
, и использую их только в случае необходимости. Вы, вероятно, никогда не будете, потому что вы преуспеете в том, что вы пытаетесь сделать без использования ref
.
В вашем комментарии упоминалось, что это устаревшее приложение, и желательно не изменять существующий класс , Это оставляет еще один вариант - отражение. Не мой любимый, но когда вы говорите «устаревшее приложение», я чувствую вашу боль. В этом случае вы можете сделать это:
public static class StringSanitizer
{
private static Dictionary<Type, IEnumerable<PropertyInfo>> _stringProperties = new Dictionary<Type, IEnumerable<PropertyInfo>>();
public static void SanitizeStringProperties<T>(T input) where T : class
{
if (!_stringProperties.ContainsKey(typeof(T)))
{
_stringProperties.Add(typeof(T), GetStringProperties(typeof(T)));
}
foreach (var property in _stringProperties[typeof(T)])
{
property.SetValue(input, Sanitize((string)property.GetValue(input)));
}
}
private static string Sanitize(string input)
{
return string.IsNullOrEmpty(input) || string.Equals("Blank", input) ? null : input;
}
private static IEnumerable<PropertyInfo> GetStringProperties(Type type)
{
return type.GetProperties(BindingFlags.Instance | BindingFlags.Public)
.Where(property => property.PropertyType == typeof(string) && property.CanRead && property.CanWrite);
}
}
Это возьмет объект, найдет его строковые свойства и очистит их. Он будет хранить строковые свойства в словаре по типу, так что, как только он обнаружит строковые свойства для данного типа, ему не придется делать это снова.
StringSanitizer.SanitizeStringProperties(someObject);