如果我有这样的方法:
public void AddSomething(string ice = "10", string sweet = "20")
{
Console.Write(ice);
Console.Write(sweet);
}
所以,如果我输入一个字符串,它将写入字符串。如果没有,它将写入默认字符串(10,20)
。
但我想要这样的事情:
public void AddSomething(string ice = "10", string sweet = "20")
{
if(ice = "")
ice = default_vaule; //which is 10
if(sweet = "")
sweet = default_vaule; //which is 20
Console.Write(ice);
Console.Write(sweet);
}
所以如果用户输入一个空字符串""
,我可以将默认值写入用户,所以我不仅可以这样做:
AddSomething("5");
这两个都是:
AddSomething("5","");
AddSomething("","5");
任何人都知道该怎么做? THX!
答案 0 :(得分:2)
你已经回答了你的问题。你也可以覆盖空案件。
public void AddSomething(string ice = "10", string sweet = "20")
{
if(string.IsNullOrEmpty(ice)) ice = "10";
if(string.IsNullOrEmpty(sweet)) sweet = "20";
Console.Write(ice);
Console.Write(sweet);
}
如果您不想写重复的文字,可以使用常量。
// these are constant and can be used as default value for parameters.
const string DefaultSweet = "20";
const string DefaultIce = "10";
public void AddSomething(string ice = DefaultSweet, string sweet = DefaultIce)
{
if(string.IsNullOrEmpty(ice)) ice = DefaultIce;
if(string.IsNullOrEmpty(sweet)) sweet = DefaultSweet;
Console.Write(ice);
Console.Write(sweet);
}
旁注:string.IsNullOrEmpty(ice)
相当于ice == "" || ice == null
答案 1 :(得分:1)
所以你想在运行时获取方法参数的默认值而不重复自己,所以不要再输入那个值(例如,如果你改变参数的默认值,那么你也可以改变它)吗?
这并不容易,因为没有defaultof(parameter)
- 运算符(类似于nameof
- 运算符)。你必须使用反射。
您可以使用此扩展程序:
public static class MethodExtensions
{
public static Result<T> ParameterDefault<T>(this MethodBase m, string paramName)
{
ParameterInfo parameter = m.GetParameters()
.FirstOrDefault(p => p.Name == paramName);
if (parameter == null)
throw new ArgumentException($"No parameter with given name '{paramName}' found", nameof(paramName));
if (parameter.ParameterType != typeof(T))
throw new ArgumentException($"Parametertype is not '{typeof(T)}' but '{parameter.ParameterType}'");
if(parameter.HasDefaultValue)
return new Result<T>((T)parameter.DefaultValue, true);
else
return new Result<T>(default(T), false);
}
}
返回以下类的实例,它只是一个包装器,如果可以确定默认值,也可以返回信息:
public class Result<T>
{
public Result(T value, bool success)
{
Value = value;
Success = success;
}
public T Value { get; private set; }
public bool Success { get; private set; }
}
现在您的方法如下:
public void AddSomething(string ice = "10", string sweet = "20")
{
MethodBase m = MethodBase.GetCurrentMethod();
if (ice == "")
ice = m.ParameterDefault<string>(nameof(ice)).Value;
if (sweet == "")
sweet = m.ParameterDefault<string>(nameof(sweet)).Value;
Console.Write(ice);
Console.Write(sweet);
}
,您无需重复参数值。
答案 2 :(得分:0)
这个问题(至少对我而言)尚不清楚,但从您发布的内容我可以建议这样的解决方案:
// default value for "ice"
const string default_ice = "10";
// default value for "sweet"
const string default_sweet = "20";
public void AddSomething(string ice = default_ice, string sweet = default_sweet)
{
// check if "ice" value is set
if(string.IsNullOrEmpty(ice))
ice = default_ice; // set "ice" value to the default one
// check if "sweet" value is set
if(string.IsNullOrEmpty(sweet))
sweet = default_sweet; // set "sweet" value to the default one
Console.Write(ice);
Console.Write(sweet);
}
然后您也可以这样称呼它:
AddSomething(sweet: "1337");
// or
AddSomething("13", "37");
或者你喜欢。