【问题标题】:Clean way of turning nullable types into reference将可空类型转换为引用的简洁方法
【发布时间】:2012-08-01 09:17:39
【问题描述】:

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

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

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

所以我需要一个通过引用来引用它们的解决方案。我唯一能想到的就是创建自己的包含双精度类型的类,但由于我使用了大量双精度类型的代码,所以工作量很大——据我所知,你不能扩展值类型。

有什么想法可以解决吗?

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

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);

【问题讨论】:

  • 您能再解释一下您的问题吗?你到底想做什么?能否提供一个代码示例(即使它不起作用)?
  • 我写了一些示例代码来澄清一下。

标签: c# pass-by-reference nullable


【解决方案1】:

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

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

double? someField = ...

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

然后:

lookup["foo"] = 123.45;

并让 that 出现在知道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);

【讨论】:

  • 是的,您正确理解了问题(我添加了一些示例代码)。问题是我需要使用 Double.Parse() 和其他函数 - 什么将引用我的对象期望“double?”。所以我需要继续转换它们三遍。这不是很干净。
  • 刚刚查找了隐式关键字。这可能无需太多更改即可工作 - 我将更改对象以使用此包装器。希望没有任何代码调用“getType”...
  • 好吧,这行不通,因为他们需要进入数据库,我很确定mysql参数添加功能会检查类型。而且我不能覆盖 getType...
猜你喜欢
  • 1970-01-01
  • 2010-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-03
  • 2010-12-06
  • 2011-01-20
  • 1970-01-01
相关资源
最近更新 更多