5

上司から、計算エンジンを調べるように言われました。事実上、ユーザーは計算を実行できるデータのテーブルを使用できます。また、当社が実施する特定の制限に基づいて独自の計算を作成することもできます (作成された計算はデータベースに保存されます)。

データベースに格納されているものに応じて、C# で特定のメソッドを呼び出すことは可能ですか? したがって、データベースが言う場合、計算は標準偏差を実行する必要があります。データベースからその情報を取得すると、C# で使用する標準偏差メソッドを呼び出すことができるでしょうか?

これが明確であることを願っています。

4

6 に答える 6

3

データに対して実行される少量/既知の操作を考慮して、データベースから取得したデータに基づいて、これらの操作を手動でコーディングすることを選択します。拡張性/保守性のために、単純な switch ステートメントを使用するのではなく、適切な設計を作成することをお勧めします。Strategy パターンがあなたのニーズに合っていると思います。

他の人が述べたように、リフレクションを使用して、データベースで指定されたメソッドを呼び出すことができます。このアプローチの問題は、データベース内のデータがメソッド シグネチャに強くリンクされていることです。これは最初のアプローチよりも保守性が低くなりますが、最小限のコード調整で優れた拡張性を実現できます。別の欠点は、使用MethodInfo.Invoke()がかなり遅いことです。

リフレクションを選択してInvoke()もアプローチが遅すぎる場合は、Jon Skeet によるこの記事をお勧めします。この記事では、MethodInfo をデリゲート インスタンスに変換する方法を説明しています。これにより、速度が大幅に向上します。最近、このために式ツリーを使用した一般的な実装を作成しました。

全体として、オプション 1 が依然として目的に最適であるように思われます。

于 2011-03-04T13:34:11.570 に答える
2

はい、可能です。これはリフレクションと呼ばれ、C# の標準機能です。多くのチュートリアルが Web 上に存在します。ここにいくつかの非常に単純なコード例があります:

using System;
using System.Reflection;

class CallMethodByName
{
   string name;

   CallMethodByName (string name)
   {
      this.name = name;
   }

   public void DisplayName()      // method to call by name
   {
      Console.WriteLine (name);   // prove we called it
   }

   static void Main()
   {
      // Instantiate this class
      CallMethodByName cmbn = new CallMethodByName ("CSO");

      // Get the desired method by name: DisplayName
      MethodInfo methodInfo = 
         typeof (CallMethodByName).GetMethod ("DisplayName");

      // Use the instance to call the method without arguments
      methodInfo.Invoke (cmbn, null);
   }
}

http://en.csharp-online.net/CSharp_FAQ:_How_call_a_method_using_a_name_string

于 2011-03-04T13:08:26.427 に答える
0

戦略パターンを実装することをお勧めします ( http://www.dofactory.com/Patterns/PatternStrategy.aspx )

必要な計算ごとに異なる戦略 (アルゴリズム) を読み込むことができます。

素敵な投稿もありますhttp://blogs.microsoft.co.il/blogs/gilf/archive/2009/11/22/applying-strategy-pattern-instead-of-using-switch-statements.aspx

于 2011-03-04T13:10:19.190 に答える
0

はい、リフレクションを使用して実行できます。ユーザーが実行できるすべての操作を含むクラスを作成し、そのメソッドを動的に呼び出すことができます。

public static class UserOperations
{
    public static decimal Average(IEnumerable<decimal> source)
    {
        return source.Average();
    }

    // Other methods
}


class Program
{
    static void Main(string[] args)
    {
        // The operation retrieved from the db
        string operation = "Average";
        // The items on which the operations should be performed
        decimal[] items = { 22m, 55m, 77m };

        object result = typeof(UserOperations).GetMethod(operation).Invoke(null, new object[] { items });
        Console.WriteLine(result);
        Console.ReadLine();
    }
}
于 2011-03-04T13:12:20.997 に答える
0

C# で switch ステートメントを使用して、データベースから取得したレコードのフィールド (またはスカラー) の値に応じて、必要な操作を実行できます。サポートされている操作の数が少ない/限られた場合、これは問題ありません。それ以外の場合は、もちろん、リフレクションと MethodInfo クラスを使用して、特定のクラスの「文字列名」でメンバー メソッドを呼び出すことができます。

于 2011-03-04T13:05:55.370 に答える
0

操作を DB に保存し、Microsoft.CSharp.CSharpCodeProviderオンザフライでコードをコンパイルするために使用できます。

こちらのサンプルを参照してください:実行時にコードを実行する

于 2011-03-04T13:07:29.740 に答える