2016-12-23 7 views
1

У меня есть следующий метод (я иллюстрировать то, что мне нужно в комментарии метода):Cycle и метод доступа в дорожат

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

Это действительно зависит от того, что вы пытаетесь сделать. Однако, когда вы сталкиваетесь с подобным сценарием, обычно это означает, что вам нужно сделать шаг назад и переосмыслить свой дизайн. Немного больше понимания требований может помочь. Когда вы это описываете, вы можете просто сделать OR (||) всех значений, и вы должны получить то, что вам нужно, но у меня есть ощущение, что для этого есть нечто большее. – JuanR

+0

без знания контекста .... Я бы использовал bitarray или массив bools. и используйте linq, чтобы определить, истинно ли только одно или даже сколько истинно. –

+0

Я обновил вопрос и добавил свою логику в комментарии к методу. По сути, каждый 'bool' представляет' WHERE' в SQL Select. Если это первый «истинный», это один синтаксис запроса. Для дополнительного «истинного» добавляется оригинальный синтаксис, но это еще один синтаксис (следовательно, знаете, является ли это первым «bool» или более). – Dillinger

ответ

0

Если вы хотите знать, сколько истинны, вы можете превратить их в целые и добавить их значения:

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); 
     } 
    } 
} 
+0

Я ошибаюсь, или вы просто ответили на мой вопрос? Я думаю, что 'ProperyInfo' +' GetValue() 'это то, что я ищу. Я тестирую его сейчас. – Dillinger

+0

Ну, это только определяет, имеет ли значение значение «true» или «false», и мне нужно знать, кто из них «true»/'false'. – Dillinger

+0

Прочтите код еще раз. Он делает именно то, что вы хотите. PInfo будет иметь имя свойства, имеющего значение true. – JuanR

0

Вы можете попробовать некоторые LINQ extensions, я думаю, что состав 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))) 

 Смежные вопросы

  • Нет связанных вопросов^_^