Цикл и метод доступа к значению параметров
У меня есть следующий метод (я иллюстрирую то, что мне нужно в комментариях метода):
public static Dictionary<int, int> Foo(bool os, bool rad, bool aci, bool outr, string distrito = null)
{
if (os == false && rad == false && aci == false && outr == false)
{
return new Dictionary<int, int>();
}
var parameters = MethodBase.GetCurrentMethod().GetParameters();
foreach (ParameterInfo parameter in parameters)
{
// I would love if parameter.Value existed, because:
// if (parameter.Value==true) {
// x++
// if (x == 1) string s = "true" + parameter.Name;
// if (x > 1) s += "Additional true" + parameter.Name;
// }
// s += "End";
}
return null;
}
Я должен знать, если одно или несколько значений bool
параметры верны. Так как их четыре, представьте себе комбинацию if
Я должен был бы сделать, чтобы проверить, является ли только один верным, или если больше чем один, которые верны.
Итак, как я могу циклически изменить текущее значение входящих параметров метода без использования самой переменной параметра?
2 ответа
Вы можете попробовать некоторые LINQ
расширения, я думаю, что состав Where
а также Select
может быть решением, с string.Join
метод сверху:
// get all parameters
var parameters = MethodBase.GetCurrentMethod().GetParameters();
// for each true parameter we add this prefix
var truePrefix = "true";
// we put this string between true parameters, if more than one are present
var separator = "Additional";
// Join IEnumerable of strings with a given separator
var total = string.Join(separator, parameters
// filter parameters to check only boolean ones, and only true ones
.Where(p => p.ParameterType == typeof(bool) && (bool)p.Value)
// select a name with prefix
.Select(p => truePrefix + p.Name)))
Если вы хотите узнать только, сколько из них истинно, вы можете превратить их в целые числа и добавить их значения:
var values = new[] {os, rad, aci, outr};
var sum = values.Select(v => Convert.ToInt32(v)).Sum();
Если вам нужно имя параметров, то вы можете создать анонимный объект и прочитать его свойства:
public static Dictionary<int, int> Foo(bool os, bool rad, bool aci, bool outr, string distrito = null)
{
var obj = new { os, rad, aci, outr};
foreach (PropertyInfo pInfo in obj.GetType().GetProperties())
{
var value = (bool)pInfo.GetValue(obj);
if (value)
{
//Do whatever you want here.
Console.WriteLine("{0}: {1}", pInfo.Name, value);
}
}
}