Добавление члена данных в уже существующий класс в C#

Я читал о методах расширения и о том, как они могут расширять классы новыми методами без необходимости изменения определения кода класса. Я хотел знать, существует ли какой-либо аналогичный способ, которым я могу добавить новый элемент данных (например, список или массив) в существующий класс и использовать член данных для хранения информации, связанной с классом?

6 ответов

Решение

Нет способа прямого добавления членов к определенному классу. Если класс не sealedвы можете расширить этот класс, используя inheritance, Если это sealedВы можете составить себе новый класс, который инкапсулирует определенный класс, который вы хотели расширить, и расширить реализацию.

Например, если у вас есть MyClass который не запечатан, и вы хотите расширить его, просто наследуйте:

public class MyExtendedClass : MyClass
{
  // Add extra logic
}

или, что касается составления нового класса самостоятельно, вы можете сделать следующее:

public class MyExtendedClass
{
   private MyClass _class;
   public string MyExtraString { get; set; }
}

Да, вы можете расширить этот класс, используя наследование.

public class MyClass 
{
    ...
}

public ExtendedClass: MyClass
{
   public int ExtraField {get; set;}
}

Таким образом, у вас есть все члены и методы (кроме приватных), которые существуют на базе.

С помощью методов расширения вы можете только расширить функциональность класса.

То, что вы ищете, можно решить с помощью:

  • Агрегация ИЛИ
  • наследование

Этот пост может помочь вам решить, какой из них использовать в вашем случае: Наследование против агрегации

Хотя другие ответы кажутся правильными, ответ на ваш вопрос ИМХО состоит в том, что невозможно расширить существующий класс новыми свойствами так, как это делают методы расширения. После того, как класс определен, вы не можете "добавлять" к нему вещи.

Метод расширения является исключением, поскольку это просто синтаксический сахар для статического вспомогательного класса.

Ты можешь использовать inheritance или же composition для этого.

Пример наследования:

public class Student
{
   int age;// all props
}

public class MAStudent : Student // MSStudent is a student with extra stuff.
{
   float maAverage;
}

Пример композиции:

public class Student
{
   int age;// all props
}

public class MAStudent
{
   Student student;
   float maAverage;

   // use student's functions inside the class
}

Наследование - это самый простой способ сделать что-то.
Проблема в том, что это делает ваши классы связанными.
Хороший перк с наследованием, что вы можете получить доступ к любому защищенному + свойству \ методу.

Также вы можете написать что-то на основе таких методов расширения, как это

public class ExistingClass 
{

}

public static class ExtendingExistingClass 
{
    private static Dictionary<ExistingClass,List> _values = new Dictionary<ExistingClass,List>();

    public List GetMyNewField(this ExistingClass t)
    {
       List res = null;
       _values.TryGetValue(t, out res);
       return res; 
    }

    public void SetMyNewField(this ExistingClass t, List value)
    {
       _values[t] = value;
    }
}
Другие вопросы по тегам