2016-05-26 4 views
2

現在、私はいくつかのクラスのシリアライザを作成しています。 私は時々私はnull値に対処する必要が、さらに次のシグネチャC#オーバーロード:null値のメソッド

public static string serialize(int val); 
public static string serialize(string val); 
public static string serialize(float val); 
public static string serialize(MyOwnClass val); 
public static string serialize(AnotherClass val); 
public static string serialize(SomethingElse val); 

での静的メソッドのセットを作成しました。 私は以下のように署名、すなわち、特別な方法でそれらを扱うしたいと思います:関数の呼び出しのようなものでなければなりません

public static string serialize(null val); 

string s = serialize(someVariableThatMightBeNull); 

そして、それはいつでもserializeが呼び出されたトリガされなければなりません値がnullで、変数が宣言された型とは無関係です。

これをC#で実装する方法はありますか?

現在、私の唯一の解決策は、各メソッドに次の行を追加することです: (nullもできるデータ型のために):私は約30の異なるケースを持っているよう

if(val == null){ dealWithNull(); } 

このソリューションは、少し退屈そうですし、私はディスパッチメソッドを持っていないことを好むだろう。例として


、XTENDはまた、null値をチェックVoidタイプを提供dispatch methodsを特徴とします。 Xtend Dispatch Methods

+0

null値では、参照が 'null'のオブジェクトを意味しますか?またはパラメータの不在? – Sidewinder94

+0

コールを明確にするための情報を追加しました – stklik

+0

'serialize(オブジェクト値)' – pm100

答えて

3

私が正しくあなたを理解している場合:

を私はobjectを待っているメソッドのシグネチャで行くと思います。

いつもは、使用したものに最も近いように見える方法の署名を選択します。したがって、利用可能なものが他にない場合は、object署名付きのメソッドのみを使用します。この方法では

、あなたはパラメータがnullであるかどうかを確認および/または直列化カスタム直列、私見については


するための独自の静的メソッドを持っていないクラスを扱うことができるようになります、私はそれを考えますそれぞれのクラスが自分自身を処理するようにする方がよいでしょう。

これを行うために、私はインターフェイスICustomSerialization私は、私は、このインターフェイスから継承をシリアル化する必要があると思いますクラスのそれぞれを作ると思いますstring CustomSerialization()

方法を含むを定義し、メソッドを実装したいです各クラスの内部。

これは、関連クラスのシリアル化コードを持つ利点を提供し、大量のシリアライゼーションクラスを回避します。

呼び出されるメソッドは、渡されているものの種類に依存し、あなたのシリアライザは、インターフェースで作業することを許可する(したがって、それぞれ特定のクラスを処理する方法を知って持っていない)

+0

私はその呼び出しが実装されている他のクラス間で曖昧であるというメッセージを受け取ります。最初に 'object'を選択しません。コンパイラはより具体的な方法を最初に選択します。 つまり 'string'は自分自身のクラスのどれでも可能です。 各クラスのシリアライズについては、変更できません。 (従来のコード) – stklik

+0

シリアル化メソッドに明示的にnull値を渡すことは、私にとっては直感的ではないようです。あなたは何をシリアル化したいですか?あなた自身に質問してください。パラメータなしでこのメソッドを呼び出すでしょうか?そうでない場合は、パラメータをコールする前にnullをチェックし、コールしない場合はチェックします。 (とにかくやってみたいと思ったら、キャストはそのトリックをやるべきです) – Sidewinder94

+0

コードは変数で呼び出されます。e 'serialize(someVariableThatMightBeNull);) 変数はどの型からでも宣言することができます。 – stklik

2

ヌルを保持するstringと入力した場合は、文字列パラメータでメソッドをヒットします。 MyOwnClass型変数があり、それがnullの場合は、MyOwnClassパラメータでメソッドをヒットします。

私はあなたの最善の選択肢は、これに外部のコードで何かをすることだと思います。

if(whatever == null) { serializeNull(whatever); } else { serialize(whatever); }

+0

はい、@ Sidewinder94。どのような種類のヌル値に対しても一種の「キャッチオール」を持っていたいと思います。 – stklik

+0

@ S.K。強いタイピングを使用してこれを行うことはできません。 C#のどのオブジェクトもnullでもかまいません。 – Sidewinder94

0

あなたの現在のソリューションは、C#(where you don't have true templates)で唯一のものです。

定型化コードの残りの部分と比較して定型コードのサイズが小さい限り、幸せに思えるかもしれません。

クラスとシリアライゼーションコードの間にタイトカップリングを導入することが可能な場合は、nullを処理する基本クラスを導入して冗長性を排除し、各派生クラスに仮想実装方法。

関連する問題