2013-11-21 163 views
2

是否可以通過字符串傳遞函數(比如讓我們說sin()),然後將它用作int?c#如何將函數作爲字符串傳遞給方法

像:(主要想法只)

public int getfunc(String func) 
{ 
    return res_of(func) 
} 

我試着用串玩弄 「Math.sin(0)」 但不能打印0 ...

我可以預定義數學函數,因爲我只需要1,然後它變得非常簡單,因爲我只傳遞函數的int值來處理,但我認爲may-hap有辦法讓它更通用。

我不想使用我想保持動態功能的映射...... 是否也是這樣做的一種方式?

+2

你是說,你想傳遞一個字符串並在代碼中執行該字符串? –

+2

所以你不想使用'Actions'和'Func's? –

+0

也許你應該提供一個你打算如何使用它的例子。也許有更好的方法,或者至少會幫助我們更好地理解你的需求 – musefan

回答

3

我想提供您可能沒有考慮到的另一種方法嘗試。

您可以使用委託而不是傳遞字符串;這樣,你就不需要任何反思。

在C#中有一個名爲Func<>的預定義委託類型,可以讓您輕鬆定義要作爲委託傳遞的方法的返回類型和參數類型。

例如,Func<>對於Math.Sin(double)將是Func<double, double>,因爲Math.Sin()返回一個雙精度型並且接受雙精度型參數。

一個例子說明清楚:

using System; 

namespace Demo 
{ 
    internal class Program 
    { 
     private void run() 
     { 
      Func<double, double> f1 = Math.Sin; 
      Func<double, double> f2 = Math.Cos; 

      double r1 = runFunc(f1, 1.0); 
      double r2 = runFunc(f2, 2.0); 

      Console.WriteLine(r1); 
      Console.WriteLine(r2); 
     } 

     private static double runFunc(Func<double, double> func, double parameter) 
     { 
      return func(parameter); 
     } 

     private static void Main() 
     { 
      new Program().run(); 
     } 
    } 
} 
2

使用http://www.csscript.net/

dynamic script = CSScript.Evaluator 
         .LoadCode(@"using System; 
            public class Script 
            { 
             public int Sum(int a, int b) 
             { 
              return a+b; 
             } 
            }"); 
int result = script.Sum(1, 2); 
+0

不幸的是,我們不允許使用腳本,因爲我們沒有學習腳本:( 無論我沒有得到它的工作。 我會玩弄它,因爲這是一種新的思維方式,雖然我沒有學習任何這些工具。 – user2893825

1

聲明是這樣的方法:

public int DoCalculation(Func<double, double> func, double a) 
    { 
     return Convert.ToInt32(func(a)); 
    } 

然後使用它是這樣的:

int result = DoCalculation(Math.Sin, 3.3); 
0

在我們的應用中使用.NET集成的C#編譯器。
這是一些工作要做,但直接實施。

Here's an answer有很多更多的細節。
我們在我們公司的生產中使用這個。

相關問題