2013-04-15 65 views
5

我正在開發一個軟件,該軟件需要實時數據並根據用戶輸入從中提取許多功能。每個可用的功能包括一個方法,它雙打的陣列,並返回想要的功能,比如這一個用於MeanAbsoluteValue的:聲明靜態類,以便它們可以存儲在列表中

public static class MeanAbsoluteValue{ 
    public static double Calculate(double[] data){ 
     return data.Sum(s => Math.Abs(s))/data.Length; 
    } 
} 

由於每個特性只有在有一個計算方法,我想嘗試重寫它們,以便可以從該集合中收集和選擇它們。

我已經試過爲它們編寫一個接口,但由於它們是靜態的,所以這是不允許的。

有沒有辦法做到這一點?如果是這樣,你能指點我的方向嗎?

+0

您將無法利用多態性使用靜態類。 – code4life

+0

你不能使用lambdas或代表嗎? – Rik

+0

我不確定具有靜態方法的抽象類是什麼,我知道你可以強制它們實現,但如果實現的邏輯我們可以使用它。 – Devesh

回答

8

您可以從這些類的Calculate方法,這樣構建的代表組成的數組:

Func<double[],double>[] array = new Func<double[],double>[] { 
    MeanAbsoluteValue.Calculate 
, MeanValue.Calculate 
, Deviation.Calculate 
// ...and so on 
}; 

這裏是一個demo on ideone

+0

完美運作,謝謝! – Sander

0

只是有函數功能的集合...

var list = new List<Func<double[], double>(MeanAbsoluteValue.Calculate, Average.Calculate) 
var accum = 0; 
foreach(var func in list) 
{ 
    accum += func(new [] {1,3,4,}); 
} 
2

店鋪委託給你的函數在字典中,並通過名稱查找起來

var methods = new Dictionary<string, Func<double[], double>>(); 
methods.Add("MeanAbsoluteValue", MeanAbsoluteValue.Calculate); 

... 
public double DoFunc(string name, double [] args) 
{ 
    var func = methods[name]; 
    return func(args); 
} 
相關問題