2011-12-29 5 views
1

私はいくつかのデータを更新するために使用したいC#メソッドを持っています。この方法は、文字列、ダブル、私は私のテーブル内の特定のフィールド名を更新したいと思うFLDの値に応じて、整数可変数のパラメータを受け入れるためにC#関数をコーディングするにはどうすればよいですか?

public void Update(string ac, string pr, string fld, Int32 intVal = null, double dblVal = null, string strVal = null) 
{ 

のいずれかを渡すことができます。

可能な値の種類の長いリストを指定する必要がないように、関数のパラメータをコード化する方法はありますか?

理想的には私はこのように、この関数を呼び出すことができるようにしたいと思います。そして、私が持っているしたい機能更新の内側

Update("key1", "key2", "location", "London"); 
Update("key1" , "key2", "beds", 2); 
Update("key1" , "key2", "price", 123.45); 

:XXXで

public void Update(string ac, string pr, xxx, yyy) 
    { 
     try 
     { 
      vm.Product = _product.Get(ac, pr); 
      vm.Product.xxx = yyy; 
      _product.AddOrUpdate(vm.Product); 
     } 
     catch (Exception e) { log(e); } 
    } 

私はしたいと思いますフィールド名とyyyに実際の値を与えます。関数の中で、フィールド名に基づいたcaseメソッドを使って何らかのキャストを行うことができるかもしれません。私はフィールド名の数が少ないので、簡単にすることができます。また、vmクラスのリフレクトからデータ型を見つける方法があるかもしれませんが、それは私の知る限りではありません。

+0

メソッド呼び出しのマニフェストの例をいくつか教えてください。 – BoltClock

+0

文字列を渡して関数内でintまたはdouble(たとえばInt32.Parse(strVal))に変換できますか、場合によっては精度の問題を引き起こす可能性がありますか? – nycdan

+0

ええ、私は常に文字列を渡すとうまくいくと思います。関数内では、必要なオブジェクト型に変換するだけで済みます。私はそれが良い方法だと思います。 –

答えて

4

EDIT

プロパティ名、および値を渡したいように見えます。反射の少しが、これは簡単に行う必要があります。

public void Update(string ac, string pr, string propertyName, object Value) { 
    try { 
     vm.Product = _product.Get(ac, pr); 
     vm.Product.GetType().GetProperty(propertyName).SetValue(vm.Product, value, null); 
     _product.AddOrUpdate(vm.Product); 
    } 
} 

のEND EDIT

Aのparams配列は、あなたのメソッドがで呼び出すことができパラメータ

public void Update(string ac, string pr, params object[] arguments) 

の可変数を受け入れることができ上記のあなたの例のいずれか

Update("key1", "key2", "location", "London"); 
Update("key1" , "key2", "beds", 2); 
Update("key1" , "key2", "price", 123.45); 
+0

私は常に4つの引数を持っています。どのように変換を処理し、私は使用する必要がある1つまたはデータ型を選択するか分からない。 –

+0

@ Samantha2 - 私の編集 –

+0

を参照してください私は小さなエラーがvm.Productでなければならないと思うと設定ではVMです。また、データ型変換もありません。私はあなたの答えとして私は最高だと思うこれを答えてマークします。私は別の質問を開き、特にデータ型の変換について述べました。ありがとう。 –

1

これらのパラメータのうち1つをに渡すことができれば、可変数が必要なようには聞こえません。 3つの異なるオーバーロードが必要なように聞こえます。

public void Update(string ac, string pr, string fld, Int32 intVal) 
{ 

} 

public void Update(string ac, string pr, string fld, double dblVal) 
{ 

} 

public void Update(string ac, string pr, string fld, string strVal) 
{ 

} 
+0

"オブジェクト"を使ってこれらをすべて1つにまとめることは可能でしょうか?次に、関数に適切なキャストを選択させますか? –

+0

'object'を使うオーバーロードを作成することはできますが、* anything *を渡すこともできます。選択肢が3つの選択肢のうちの1つを選択する場合、この方法で過負荷を使用することが適切な方法です。これを行うための関数を1つだけ持つことはできません。 –

1

私がお勧めする最もよい方法は、すべてのパラメータをオブジェクトで置き換えることです。これらすべてのパラメータは、データベースを更新する情報を表します。

class UpdateInfo 
{ 
    public string ac {get; set;} 
    public string pr {get; set;} 
    public string fld {get; set;} 
    . 
    . 
    . 
} 

各パラメータの検証ロジックはすべてここにも入ります。

public void Update(UpdateInfo obj) 
{ 
. 
. 
} 
1

まず第一に、あなたが1つのカスタムクラスではなく、3つの別々の呼び出しを行うよりも、一度にこれらの値のすべてを渡す必要がありそうです。しかし、それがあなたがしたい、またはできないものであれば...

関数呼び出しの前にさまざまな値をすべて文字列に変換できる場合は、そのように渡すことができます。実際、彼らがテキストボックスから来ている場合、それらはすでに始める文字列であるかもしれません。 3番目のパラメータ(例:"location"、 "beds")は、必要なデータ型を明確に示すことができます。これはうまくいくはずです。また、必要なデータ型を渡すこともできます。

あなたは整数値INTVALに渡す必要がある場合:

string strVal = intVal.ToString(); 
Update(ac, pr, fld, strVal); 

次に、あなたの関数の中で、あなたが挿入する値が文字列以外のものも、それを変換する必要があるかどうかを決定する必要があります

。私は、Double.TryParseとInt32.TryParseを使用してエラーをよりよくトラップすることをお勧めします。

前回は...これはエレガントではありませんが、うまくいくと思いますが、試してみるといいかもしれないので、幸運にもこれで問題が発生した場合はお知らせください。

関連する問題