Я задавал вопросы о том, что я думаю might be solutions, но кто-то указал, что я попадаю в проблему XY и что я должен просто спросить о моей точной проблеме.Как сохранить информацию об объекте после присвоения в C#?
У меня есть структура, которую я хочу, чтобы другие люди могли использовать их в своих программах. Необходимо иметь возможность неявно преобразовывать этот тип из других существующих типов, но в то же время некоторая информация должна сохраняться после этого назначения. Вот простой пример вопроса:
using System;
public struct MyStruct {
public string SomethingImportant;
public MyStruct(string s) {
SomethingImportant = s;
}
//this function needs to have no knowledge of how/where the struct is being used
public bool SomeFunction(string s) {
return s == SomethingImportant;
}
public static implicit operator MyStruct(double x) {
return new MyStruct();
}
}
public class MyClass {
MyStruct child = new MyStruct("important");
public MyClass() {
//prints out "important"
Console.WriteLine(child.SomethingImportant);
child = 7.5;
//prints out ""
Console.WriteLine(child.SomethingImportant);
}
}
После того, как структура заменяется новой структурой из неявного преобразования, информация, хранимая в SomethingImportant
теряется. Это было бы естественным местом для перегрузки оператора присваивания, но, к сожалению, это невозможно в C#.
Мои мысли обратились к атрибутам, потому что дополнительная информация не нуждается в изменении после первоначального объявления объекта, и это было бы наиболее приемлемо, если бы сохранение было ограничено полями классов. Похоже, что это не жизнеспособный вариант, потому что структура не может обращаться к связанным с ним атрибутам, если не знает, в каком типе он живет.
Есть ли способ сделать что-то удаленно, как это, в C#? Я знаю, что добавление явной функции обновления, такой как MyStruct.Update(double x)
, даст желаемое поведение, но, основываясь на том, как функционирует библиотека, это будет огромным бременем для пользователей с точки зрения перезаписи большого количества существующего кода. Я бы скорее сделал что-то грязное, небезопасное или неясное в своем собственном коде, чем требовалось столько переписывать для пользователей библиотеки.
Спасибо за любые мысли!
Поскольку 'child' является ссылкой на объект, а не сам объект, я не может видеть очевидный способ заставить '=' вести себя так, как вы ожидаете, с неявными преобразованиями. –