如何在c#中分配后保留有关对象的信息?

时间:2016-02-07 16:23:46

标签: c# attributes persistence variable-assignment

我一直在询问我的想法might be solutions,但是有人指出我陷入了XY问题,我应该问一下我的确切问题。

我有一个结构,我希望其他人能够在自己的程序中使用。它需要可以从其他现有类型隐式转换为此类型,但同时在分配后需要保留一些信息。这是一个简单的问题示例:

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)这样的显式更新函数会产生所需的行为,但是,根据库的运行方式,这对用户来说在重写大量现有代码方面会是一个巨大的负担。我宁愿在我自己的代码中做一些混乱,不安全或模糊的事情,而不是需要为图书馆用户进行如此多的重写。

感谢您的任何想法!

1 个答案:

答案 0 :(得分: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;