Установка пользовательских значений в расширенном классе
Я не уверен, если это возможно. Я сталкиваюсь с уникальной проблемой, касающейся API клиента. Мне нужно расширить класс и добавить свойство bool, которое не существует в базовом классе.
ниже приведен пример того, что я пытаюсь достичь.
public class baseClass
{
//.. No Editable Access
}
public class Extended
{
public bool flaggedAsDeleted(this baseClass bc)
{
//Idealy was looking for get; set; but I know that don't work
return true;// Need to know if possible to set property on baseClass or Alternative
}
public void flagAsDeleted(this baseClass bc)
{
flaggedAsDeleted = true;
}
}
public class program
{
public void doit()
{
baseClass bc = new baseClass();
bc.flagAsDeleted();
}
}
2 ответа
Если вы пытаетесь расширить класс, вы делаете это так:
public class BaseClass
{
//.. No Editable Access
}
public class Extended : BaseClass
{
public bool FlaggedAsDeleted { get; set; }
}
Если вы пытаетесь добавить данные в существующий класс, у вас есть два варианта:
Наследование - как видно выше.
Инкапсуляция - создайте новый объект, который содержит экземпляр типа, к которому вы добавляете.
C# предоставляет функцию под названием Extension Methods, которая позволяет, казалось бы, добавлять методы в существующие классы. Однако на самом деле это просто синтаксический сахар, поскольку вы все еще ограничены общедоступным API класса.
public class BaseClass
{
public int Value { get; set; }
}
public static class ExtensionMethods
{
public static void Increment(this BaseClass b)
{
b.Value += 1;
}
}
Методы расширения не позволяют вам добавлять данные в существующий класс.
Это не уникально. Это общая проблема, решаемая с помощью шаблона проектирования, называемого декоратором.