2015-04-03 52 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創建方法」,因爲每個lambda都會由編譯器轉換爲本地方法(如果OP實際上意味着增加這種限制,我真的很懷疑)。 –

+0

是的,這聽起來像他真正想要的是能夠編寫一個算法,該算法需要一個參數,讓他指定應用該算法的屬性,以避免必須重新編寫每個需要搜索的屬性的整個算法。 – Erik

相關問題