我正在尝试概括我编写的解决方案,以便它可以应用于类似的问题。
我有许多不同的对象都包含可以为空的双打。我想以某种方式将它们(双打)传递到字典中,然后将数据直接输入到相关对象中。
如果双打是引用类型,这将非常简单,但它们不是。
所以我需要一个通过引用引用它们的解决方案。我唯一能想到的就是创建我自己的包含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);
答案 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);