1

私が書いた解決策を一般化して、同様の問題に適用できるようにしようとしています。

null 可能な double をすべて含むさまざまなオブジェクトがいくつかあります。私はどうにかしてそれら (ダブルス) を辞書に渡し、データを問題のオブジェクトに直接入れたいと考えています。

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

1 に答える 1

2

あなたの意図が持つことである場合(非コンパイルコード、説明のみ):

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

double? someField = ...

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

そして後で:

lookup["foo"] = 123.45;

を知っていたコードに対してそれをsomeField表示させます: 実際、それは機能しませんし、機能しません。まあ、めちゃくちゃハックな方法がいくつかありますが、それをしないでください. あなたが説明することは、実際にそれを行う正しい方法です:

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);
于 2012-08-01T09:24:28.843 に答える