我不知道标题在技术上是否正确,但我试图在不同的时间将不同的字符串传递给相同的方法,让我解释一下:
当用户删除新帐户时,会调用此帐号:
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} });
但是我收到错误:&#34;方法没有超载&#39; ToConstantsString&#39;取0个参数。&#34;
还有其他办法吗?或者我做错了什么?
答案 0 :(得分:0)
这不是Extensionmethods的工作方式。
"SignupStart".ToConstantsString()
将返回Constants.SignupStart
。
这就是ExtensionMethods所做的。
答案 1 :(得分:0)
您的问题没有明确定义,因为我们无法了解您的常量值是否与您的扩展方法返回的值完全相同。
为了避免这种步骤,你可以使用包含所有不同类型的枚举,最后如果你需要一个字符串,你可以从枚举元素中获取它。
回到你的错误,该错误消息的原因是由于你调用扩展方法而不是字符串,因为它在签名中是预期的,但是在类上。
您可能希望在外部调用中获得的参数:
stringInput.ToConstantsString()
答案 2 :(得分:0)
为了避免这种丑陋的&amp;不可维护的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());
答案 3 :(得分:0)
看起来你正在逆转使用的常量。我们的想法是只在一个地方存储一个值,并使用编译的属性名称或常量名称来引用它。这样一个可能发生变化的字符串只存储在一个地方。
你所做的恰恰相反。您正在使用字符串输入来返回常量。
你可以(并且应该)替换它:
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.
,intellisense会显示可用选项。你不需要记住那个字符串是什么。
理想情况下,您希望避免在代码中使用这些神奇的字符串。如果你需要知道一个字符串值来检索一个常量,那么它就会失去一个常数的好处。
常量也可以帮助您在编译时而不是在运行时捕获错误。例如,如果有人意外地键入“SignUpStart”而不是“SignupStart”,您的代码就可以构建,但是它会在运行时失败,并且有人可能会想出去找出原因。