У вас есть хорошие идеи, но если я понимаю, что вы пытаетесь сделать, я думаю, что есть более идиоматический c - более OOP способ решить эту проблему, который также гораздо менее сложен. Я предполагаю, что у вас есть стандартная электронная таблица, в которой есть много строк в электронной таблице, которые все имеют одинаковые столбцы. Также могут быть разные столбцы в разных разделах электронной таблицы.
Я преобразовал несколько электронных таблиц в приложения и остановился на этом подходе. Я думаю, вам понравится.
Для каждого набора заголовков я бы смоделировал это как отдельный объектный класс. Каждый столбец будет свойством класса, и каждая строка будет одним экземпляром объекта.
Во всех, кроме очень редких случаях, я бы сказал, просто смоделируйте ваши свойства, чтобы включить вычисления. Простой пример c блока будет выглядеть примерно так:
public class Box
{
public double Length { get; set; }
public double Width { get; set; }
public double Height { get; set; }
public double Area
{
get { return 2*Height*Width + 2*Length*Height + 2*Length*Width; }
}
public double Volume
{
get { return Length * Width * Height; }
}
}
И идея здесь в том, что если есть свойства (столбцы в Excel), которые используют другие вычисляемые свойства / столбцы в качестве входных данных, просто используйте само свойство:
public bool IsHuge
{
get { return Volume > 50; }
}
. NET будет обрабатывать все тяжелые работы и зависимости для вас.
В большинстве случаев это вылетит в C# по сравнению с Excel, и я не думаю, что вам придется беспокоиться о скорости вычислений при настройке каскадных объектов.
Когда я говорил о всех, кроме редких случаях, если у вас есть свойства, которые очень дорогие в вычислительном отношении затем вы можете сделать эти свойства частными и затем запустить вычисления.
public class Box
{
public double Length { get; set; }
public double Width { get; set; }
public double Height { get; set; }
public double Area { get; private set; }
public double Volume { get; private set; }
public bool IsHuge { get; private set; }
public void Calculate()
{
Area = 2*Height*Width + 2*Length*Height + 2*Length*Width;
Volume = Length * Width * Height;
IsHuge = Volume > 50;
}
}
Прежде чем вы go пойдете по этому пути, я бы порекомендовал вам провести тестирование производительности. Если у вас нет миллионов строк и / или очень сложных вычислений, я сомневаюсь, что этот второй подход был бы полезен, и у вас есть преимущество в том, что вам не нужно определять, когда вычислять. Это происходит, когда и только когда к объекту обращаются.