1

いくつかのロジックを何度も実行する switch ステートメントがあります。カットアンドペーストを使用するのではなく、関数に入れたかったのですが、これでひどく失敗しています。

これがやりたいのですが、関数内のbreakタグが存在しないためコンパイルできません。誰でもこれをより適切に機能するバージョンにリファクタリングできますか?

switch(param.ToString())
{
  case "1":
  BreakIfNotArgumentType<B>(param);
 //do stuff
  break;
  case "2":
  BreakIfNotArgumentType<BF>(param);
 //do stuff
  break;
}

   private T BreakIfNotArgumentType<T>(object argumentObject)
    {
        if (argumentObject is T)
        {
            return (T)argumentObject;
        }
        else
        {
            break;
        }            
    }
4

4 に答える 4

2

あなたの関数は基本的にasオペレーターの機能を複製しています。

string foo = "foo";

....

object a = foo;
object b = 12;
....

string bar = a as string; // will give you "foo"
string zed = b as string; // returns null

演算子はas、ランタイム セーフ キャストとして機能します。ターゲット インスタンスをターゲット型にキャストできない場合は、null 参照が割り当てられます。このため、参照型でのみ機能します。最も一般的な使用法は次のようなものです...

string bar = a as string;

if(bar != null)
{
    // do stuff
}

これにより、型チェックとキャスト操作が 1 つのステートメントで行われるためです。

switchステートメントを投稿する必要があります。あなたが持っていたように(関数内のコードをswitchステートメントに置き換えることを期待していたので、関数というよりマクロのようになっている)真にインライン関数を記述しようとしてもうまくいきません。

于 2009-08-17T16:05:52.150 に答える
0

ブール値を返すメソッドを作成し、戻り値を確認します。

switch(param.ToString())
{
  case "1":
  if (CheckForArgumentType<B>(param))
  {
   // Do your cast here
   param = (B)param
  }
  else
     break;
  case "2":
  if (CheckForArgumentType<B>(param))
  {
   // Do your cast here
   param = (B)param
  }
  else
     break;
  }
  .................

   private bool CheckForArgumentType<T>(object argumentObject)
    {
        return (argumentObject is T)

    }
于 2009-08-17T15:54:14.093 に答える
0

引数をキャストできない場合、またはコードのその部分を処理する方法に関するいくつかのアイデアに対して例外をスローできない場合、関数に null を返すようにすることができます。

   private T BreakIfNotArgumentType<T>(object argumentObject)
    {
        if (argumentObject is T)
        {
            return (T)argumentObject;
        }
        else
        {
            return null;
        }            
    }

または

   private T BreakIfNotArgumentType<T>(object argumentObject)
    {
        if (argumentObject is T)
        {
            return (T)argumentObject;
        }
        else
        {
            throw CustomException("Argument wasn't valid!");
        }            
    }
于 2009-08-17T15:48:38.533 に答える
0

比較する値が 2 つしかない場合 - 代わりに IF ステートメントを使用します

于 2009-08-17T15:55:15.667 に答える