2016-06-22 12 views
1

タイトルが技術的に正しいかどうかわかりませんが、別の時に同じメソッドに別の文字列を渡そうとしています。異なる文字列を同じメソッドに渡すにはどうすればよいですか?

ユーザーが新しいアカウントを削除すると、

この方法を通過してしまいます
RecordMetric(Constants.AccountDeleted, userId, String.Empty); 

internal static void RecordMetric(Constants Constant, long userid, string data, long? siteid) 
    { 
     MetricsSystemService.TrackEvent(Constants.AccountDeleted, 
         new Dictionary<string, string> { { "userid", userid.ToString() }, { "data", data} }); 
    } 

これは私たちに自分のアカウントを削除したどのように多くのユーザーの指示を与えるアプリケーション洞察にデータを送信します。

しかし、私は、例えば、上記の方法によって異なる文字列を渡したい場合:

RecordMetric(Constants.PasspointReset, userId, String.Empty); 

私はそれになりたいの代わりに、私はちょうどそれのための別の方法を作成することもできますが、それは非効率的になるだろうAccountDeleted文字列と同じメソッドを通過します。 "「いいえ過負荷方法は:

internal static class ConstantsString 
    { 
     internal static string ToConstantsString(this string input) 
     { 
      if (input == "SignupStart") return Constants.SignupStart; 
      if (input == "SignupEnd") return Constants.SignupEnd; 
      if (input == "LoginStart") return Constants.LoginStart; 
      if (input == "LoginEnd") return Constants.LoginEnd; 
      if (input == "AccountDeleted") return Constants.AccountDeleted; 
      if (input == "PasspointReset") return Constants.PasspointReset; 
      if (input == "ImageChange") return Constants.ImageChange; 
      if (input == "LoginFailed") return Constants.LoginFailed; 
      if (input == "SignupVerified") return Constants.SignupVerified; 
      if (input == "LibraryImageUsed") return Constants.LibraryImageUsed; 
      if (input == "DeveloperAccountCreated") return Constants.DeveloperAccountCreated; 
      if (input == "DeveloperAccountEdited") return Constants.DeveloperAccountEdited; 
      if (input == "DeveloperAccountDeleted") return Constants.DeveloperAccountDeleted; 

      return String.Empty; 
     } 
    } 

などのような文字列の拡張子を通る:

は、私は、文字列の拡張子を作ってみた

 MetricsSystemService.TrackEvent(ConstantsString.ToConstantsString(), 
      new Dictionary<string, string> { { "userid", userid.ToString() }, { "data", data} }); 

が、私はエラーを取得していませんよToConstantsString 'は0個の引数をとります。 "

これを行う別の方法はありますか?または私は何か間違っているのですか?

+0

なぜ、 'RecordMetric(Constants.PasspointReset、userId、String.Empty);'は動作しませんか? 'RecordMetric'は既に' string'、 'userid'と' string'パラメータを取っているようです。 – Lee

+0

新しいメソッドを作成せずにやりたいことができるようです。 'RecordMetric(Constants.AccountDeleted、userId、String.Empty);などのコードは実際に実行されるべきです。 – pijemcolu

答えて

0

これはエクステンションメソッドの仕組みではありません。

"SignupStart".ToConstantsString() 

Constants.SignupStartを返します。

これはExtensionMethodsの機能です。

0

Constantsの値が拡張メソッドによって返された値とまったく同じかどうかわからないため、質問が明確に定義されていません。

このようなステップを避けるには、さまざまなタイプの列挙型を使用することができます。結果的に文字列が必要な場合は、enum要素から取得できます。

エラーメッセージが表示されるのは、拡張メソッドを文字列ではなく、署名ではなくクラス上で呼び出すためです。

あなたが外の呼び出しから取得するパラメータにものにしたいかもしれません:この醜い& unmaintenable ifsを避けるために

stringInput.ToConstantsString() 
0

あなたは、リフレクションを使用することもできます。

internal static class ConstantsString 
{ 
    internal static string ToConstantsString(this string input) 
    { 
     try 
     { 
      Type t = typeof (Constants); 
      return t.GetProperty(input).GetValue(t, null).ToString(); 
     } 
     catch (Exception) 
     { 
      return "Error"; 
     } 
    } 
} 

そして、それを使用しますように:

Console.WriteLine("LibraryImageUsed".ToConstantsString()); 
0

どんな定数が使用されているかを逆にしています。この考え方は、値を1つの場所に格納し、コンパイルされたプロパティ名または定数名を使用して値を参照することです。そうすれば、潜在的に変化する文字列は1つの場所にしか格納されません。

あなたがやっていることは、それとは逆です。あなたは定数を返すために文字列入力を使用しています。

あなたは(とすべきである)、この置き換えることができます:あなただけの代わりにConstants.SignupStartを直接参照

var someString = "SignupStart".ToConstantsString(); 

を呼び出す

internal static class ConstantsString 
{ 
    internal static string ToConstantsString(this string input) 
    { 
     if (input == "SignupStart") return Constants.SignupStart; 

そしてどこを。

時々、定数として宣言されていない文字列を「マジック文字列」と呼びます。つまり、使用する正確な文字列を知る必要があります。たとえば、誰かが必要とする文字列が「SignupStart」であることを知らない場合、どのようにしてそれらを見つけ出すのですか?彼らはそれを見つけるためにコードを掘り起こす必要があります。定数とenumはそれを減らしたり、なくしたりします。 Constants.と入力すると、intellisenseが利用可能なオプションを表示します。その文字列が何であるかを覚える必要はありません。

理想的には、コード内にこれらの魔法の文字列を置かないようにしたいと考えています。定数を取得するために特定の文字列値を知る必要がある場合は、定数を持つ利点を無効にします。

定数は、実行時ではなくコンパイル時にエラーを捕捉するのにも役立ちます。たとえば、誰かが誤って「SignupStart」の代わりに「SignUpStart」と入力した場合、あなたのコードはビルドできますが、実行時には失敗し、誰かが理由を突き止めることができなくなります。

関連する問題