Итак, моя проблема в том, что я хочу удалить нули для всех своих строк в сложных объектах, таких как POCOs и DTO. Я могу это сделать, но метод, который я делаю, кажется, что это может быть лучше. Поэтому я подумал, что кто-то из Stack Overflow имеет лучший способ.Хотите вызвать базовый класс, используя общий с этим «дочерним» классом
Базовый класс:
public class PropertyEmptySetter<T> where T : class
{
T obj { get; set; }
public PropertyEmptySetter(T myObj)
{
obj = myObj;
UpdateStringProperties();
}
public PropertyEmptySetter()
{
}
public void UpdateStringProperties()
{
foreach (var prop in obj.GetType().GetProperties().ToList())
{
if (prop.PropertyType == (typeof(string)))
{
if(prop.GetValue(obj) == null)
prop.SetValue(obj, String.Empty);
}
}
}
}
Детский класс (ПОКО Object):
public class POCO : PropertyEmptySetter<POCO>
{
public int Id { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public string Purpose { get; set; }
public POCO()
{
var setter = new PropertyEmptySetter<POCO>(this);
}
}
Тестирование это работает:
private static string _s = "";
static void Main(string[] args)
{
var item = new POCO {Id = 1, Name = "Brett", Description = "Me"};
var props = item.GetType().GetProperties();
foreach (var prop in props)
{
_s += "Type: " + prop.Name + "\tValue:" + (prop.GetValue(item) ?? "NULL") + Environment.NewLine;
}
Console.WriteLine(_s);
Console.ReadLine();
}
Так что вышеуказанные работы, но я надеялся, чтобы сократить его что-то вроде детского конструктора, заявив:
public POCO() : base(this)
Ehh, ehhh. Visual Studio не нравится это и заявляет, что «не может использовать„это“в инициализаторе члена»
Или иметь конструктор без параметров в базе сделать что-то вроде
public PropertyEmptySetter()
{
obj = (child) // Yes I know this does not exist
UpdateStringProperties();
}
Я в основном надеялся эшафот всей логики так что наследование просто знает: «О, вы хотите, чтобы этот объект, который вы создаете, ПРЯМО СЕЙЧАС, получил!» Кажется, что я должен сделать это в рамках конструктора и не могу обойти это. Но я могу просто не знать о более легком пути. Я не хочу этого, когда экземпляр объекта за его пределами, я хочу это, чтобы он просто поднимался, когда объект создается внутри себя и базового класса. Возможно ли это или это метод, который я показываю самым простым способом?
Ваш ответ нужно удалить: 1. «строка» неизменна, но не в том смысле, что ее нельзя изменить, вы идете по касательной к изменчивости, которая не имеет никакого отношения к вопросу. 2. Когда я добавляю в коллекцию из GetProperties объекта, я возвращаю коллекцию PropertyInfo на основе объекта, который он вызывает. Если я добавлю точку останова и посмотрю каждую информацию о свойствах, это легко увидеть. Вы заявляете что-то совершенно ложное от предположения. 3. Ваш конечный ответ имеет некоторые достоинства, но игнорирует основной запрос сделать это в строительстве НЕ внешним классом. – djangojazz
Не хотите ли вы, чтобы нас всех расставили, чтобы определить и продемонстрировать то, что «полностью ложно»? –
«Во-вторых, ваша реализация не работает, и вы не проверяли на то, чего пытаетесь избежать. Если вы попытаетесь с этим:« Вы принимаете то, что я не делал. Но вы правы, я мог бы сформулировать это как «Я хочу удалить null экземпляры» verus «Я хочу удалить nulls». В основном, весь ваш ответ был предположен, оскорбительный и оскорбительный, основанный на сделанных вами условиях, которые не были в этом примере. Вы могли бы сказать: «Явное назначение не учитывает этого». и со мной все будет в порядке. Вместо того, чтобы ты сделал то, что я сказал, чтобы не делать, а затем предположил, что это то, что я хотел. – djangojazz