2015-04-03 3 views
0

Я пытаюсь передать аргумент методу, а затем использовать этот аргумент как метод расширения массива, но я боюсь. Мой код:Можно ли использовать аргумент метода как метод расширения массива

//create method 
public static void BankChoice(string SearchItem) 
{ 
    //declare variables 
    double tempMin = 0; 
    int minIndex = 0; 

    //set a temporary double as the first index of array 
    tempMin = Program.array_SH1[0].SearchItem; 

    //start loop to go through whole array 
    for (int y = 0; y <= array_SH1.Length; y++) 
    { 
     //if the temp double is bigger than the array item, 
     //make array item temp double 
     if (tempMin > array_SH1[y].SearchItem) 
     { 
      tempMin = array_SH1[y].SearchItem; 
      minIndex = y; 
     } 
    } 
} 

Я бы тогда назвать код, как:

BankChoice("OpenPrice") 

Однако это не работает. Компилятор не примет строку в качестве расширения массива, и она просто бросает и ошибочно. Есть в любом случае, чтобы исправить это без необходимости делать это от руки, и создать метод для всех вариантов SearchItem

Благодарности

+0

Нет, вы не можете этого сделать. Что вам нужно для исследования - как использовать рефлексию для достижения этого. – Shoe

+0

Боковое примечание: ваш образец не отображает синтаксис, который напоминает метод расширения вызова в любом месте ... –

ответ

2

Что вы можете сделать, это поставить делегат:

public static void BankChoice(Func<ArrayValueType, double> searchBy) 
{ 
    //... 
    // use the delegate to evaluate the result for each time you need to get the value from an item in your array. 
    tempMin = searchBy(Program.array_SH1[0]); 
    //... 
} 

Где ArrayValueType - тип объекта в вашем массиве. Тогда вы называете его

BankChoice(x => x.OpenPrice); 

Это позволит Вам определить свойство искать дальше, и это будет сделано безопасным способом типа. Единственным ограничением на данный момент является то, что свойство конвертируется в double. Можно обойти это для свойств родового типа, и есть различные способы сделать это в зависимости от ваших потребностей.

+0

Хотя это правильный подход, строго говоря, он не удовлетворяет «без ... создания метода для всех вариантов SearchItem», поскольку каждая лямбда будет быть преобразованным в локальный метод компилятором (я серьезно сомневаюсь, что если OP фактически означает добавить такое ограничение). –

+0

Да, похоже, что он действительно хочет написать алгоритм, который принимает параметр, который позволяет ему указать, какое свойство применять алгоритм, чтобы избежать необходимости переписывать весь алгоритм для каждого желаемого свойства для поиска. – Erik

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