2016-02-07 6 views
4

Я задавал вопросы о том, что я думаю 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), даст желаемое поведение, но, основываясь на том, как функционирует библиотека, это будет огромным бременем для пользователей с точки зрения перезаписи большого количества существующего кода. Я бы скорее сделал что-то грязное, небезопасное или неясное в своем собственном коде, чем требовалось столько переписывать для пользователей библиотеки.

Спасибо за любые мысли!

+0

Поскольку 'child' является ссылкой на объект, а не сам объект, я не может видеть очевидный способ заставить '=' вести себя так, как вы ожидаете, с неявными преобразованиями. –

ответ

0

Я бы сказал, что это невозможно вообще, учитывая, что «что-то важное» не равно для всех экземпляров MyStruct (в этом случае тривиальное решение должно сделать это static).

Неявное преобразование создает новый объект, который ничего не знает о какой переменной он назначается, даже если он назначен вообще. Таким образом, вы не можете получить доступ к данным из этой переменной.

Возможно, идея, которую вы имели с атрибутами, стоит преследовать, то есть перемещать отметку на один уровень в иерархии классов.

Чтобы прояснить свою точку зрения, что ожидаемый выход из этого:

public class MyClass 
{ 
    public MyClass() 
    { 
     MyStruct child1 = new MyStruct("abc"); 
     // should print "abc" 
     Console.WriteLine(child1.SomethingImportant); 

     MyStruct child2 = 7.5; 
     // should print out what? 
     Console.WriteLine(child2.SomethingImportant); 

     MyStruct child3 = new MyStruct("cde"); 
     child3 = 5.7; 
     // will never, ever print "cde" (if not static) 
     Console.WriteLine(child2.SomethingImportant); 
    } 
} 

, но это будет работать:

public MyOtherClass 
{ 
    public MyStruct TheChild; 
    public string SomethingImportantAssociatedToTheChild; 
} 

[...] 

MyOtherClass a; 
a.SomethingImportantAssociatedToTheChild = "abc"; 
a.TheChild = 7.5; 
+0

Ожидаемый результат будет «", потому что SomethingImportant никогда не был установлен. Я понимаю, что это также причина, по которой второй вывод «в моем первоначальном примере, но я ищу обходные решения или хаки». – Ivanna

Смежные вопросы