【问题标题】:How do i pass different strings into the same method?如何将不同的字符串传递给同一个方法?
【发布时间】:2016-10-24 12:25:08
【问题描述】:

我不知道标题在技术上是否正确,但我试图在不同的时间将不同的字符串传递给同一个方法,让我解释一下:

当用户删除他们的新帐户时,会调用它:

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 个参数。”

还有其他方法可以做到这一点吗?还是我做错了什么?

【问题讨论】:

  • 为什么RecordMetric(Constants.PasspointReset, userId, String.Empty); 不起作用?看起来RecordMetric 已经接受了stringuseridstring 参数。
  • 看起来你可以在不创建任何新方法的情况下做你想做的事。 RecordMetric(Constants.AccountDeleted, userId, String.Empty); 之类的代码应该实际运行。

标签: c# string methods


【解决方案1】:

这不是扩展方法的工作方式。

"SignupStart".ToConstantsString() 

将返回Constants.SignupStart

这就是 ExtensionMethods 所做的。

【讨论】:

    【解决方案2】:

    您的问题没有明确定义,因为我们不知道您的常量值是否与扩展方法返回的值完全相同。

    为了避免这种步骤,您可以使用所有不同类型的枚举,最终如果您需要一个字符串,您可以从枚举元素中获取它。

    回到您的错误,该错误消息的原因是由于您不是在字符串上调用扩展方法,正如签名中所预期的那样,而是在类上。

    您可能希望在从外部调用获得的参数上这样做:

    stringInput.ToConstantsString()
    

    【讨论】:

      【解决方案3】:

      为避免这种丑陋且难以维护的ifs,您可能需要使用反射:

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

      【讨论】:

        【解决方案4】:

        看起来你正在颠倒常量的用途。这个想法是将一个值仅存储在一个地方,并使用编译的属性名称或常量名称来引用它。这样,一个可能发生变化的字符串只存储在一个地方。

        你所做的恰恰相反。您正在使用字符串输入来返回一个常量。

        你可以(并且应该)替换这个:

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

        以及任何你打电话的地方

        var someString = "SignupStart".ToConstantsString();
        

        请直接参考Constants.SignupStart

        有时未声明为常量的字符串称为“魔术字符串”。换句话说,您必须知道要使用的准确正确的字符串。例如,如果有人不知道他们需要的字符串是“SignupStart”,他们如何找到?他们需要挖掘代码才能找到它。常量和枚举减少或消除了这一点。您输入Constants.,智能感知会向您显示可用选项。你不需要记住那个字符串是什么。

        理想情况下,您希望避免在代码中包含这些魔术字符串。如果您需要知道某个字符串值来检索常量,那么它会破坏拥有常量的好处。

        常量还可以帮助您在编译时而不是在运行时捕获错误。例如,如果有人不小心输入了“SignUpStart”而不是“SignupStart”,您的代码可以构建,但它会在运行时失败,并且有人可能会想尽办法找出原因。

        【讨论】:

          猜你喜欢
          • 2013-11-06
          • 2013-07-10
          • 2021-09-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-03-27
          相关资源
          最近更新 更多