将可空类型转换为参考的清洁方式

时间:2012-08-01 09:17:39

标签: c# pass-by-reference nullable

我正在尝试概括我编写的解决方案,以便它可以应用于类似的问题。

我有许多不同的对象都包含可以为空的双打。我想以某种方式将它们(双打)传递到字典中,然后将数据直接输入到相关对象中。

如果双打是引用类型,这将非常简单,但它们不是。

所以我需要一个通过引用引用它们的解决方案。我唯一能想到的就是创建我自己的包含double的Class,但是由于我使用了很多Double的代码,所以这是很多工作 - 据我所知你不能扩展值类型。

关于如何解决这个问题的任何想法?

已添加 - 这是我正在尝试做的事情的示例代码示例。这不是实际的代码。

void ReadTable(Dictionary<string,double?> dict)
{
//read some sort of table here by usign the string as the headers
dict["header"] = Convert.toDouble(tableValue);
//etc...
}

MyObject myObject = new MyObject();
//fill it up from the table
Dictionary<string,double?> req = new Dictionary<string,double?>();
req.add("header",myObject.something);
req.add("header2",myObject.somethingElse);
ReadTable(req);

MyOtherObject myOtherObject = new MyOtherObject();
//fill it up from the table
Dictionary<string,double?> req2 = new Dictionary<string,double?>();
req2.add("aheader",myOtherObject.m2something);
req2.add("aheader2",myOtherObject.m2somethingElse);
ReadTable(req2);

1 个答案:

答案 0 :(得分:2)

如果您的意图是(非编译代码,仅供说明):

Dictionary<string, ref double?> lookup = ...

double? someField = ...

lookup.Add("foo", ref someField);

然后再说:

lookup["foo"] = 123.45;

并且 出现在知道someField的代码中:那么确实,这不会也不会起作用。嗯,有一些疯狂的hacky方式,但不这样做。你所描述的确实是正确的方法:

public class MyWrapper {
    public double? Value {get;set;}
}

Dictionary<string, MyWrapper> lookup = ...

MyWrapper someField = new MyWrapper();

lookup.Add("foo", someField);

然后再说:

lookup["foo"].Value = 123.45;

然后,任何引用someField.Value的代码都会看到新值。

你可以用泛型来概括它。

如果您想最小化代码更改,您可以添加运算符:

public class MyWrapper {
    public double? Value {get;set;}
    public static implicit operator double?(MyWrapper value) {
        return value == null ? null : value.Value;
    }
}

至少适用于执行以下操作的代码:

double? tmp = someField;

或:

SomeMethodThatTakesNullableDouble(someField);