ことは可能でコンパイルおよび実行する新しいコードで実行す。います。

StackOverflow https://stackoverflow.com/questions/234217

  •  04-07-2019
  •  | 
  •  

質問

注意:数式の評価は、この質問です。したいコンパイルおよび実行する新しいコードで実行す。います。 ることがあると言われ...

ようすることができる入力方程式は以下のような、テキストボックス

x = x / 2 * 0.07914
x = x^2 / 5

そして、その方程式の適用を受信データポイント。着信データポイントに代表される x 各データポイントで処理することにより、ユーザ指定の式により求まります。かったこともなかったように、これに必要な構文解析ステートメント式のためのすべての算定

float ApplyEquation (string equation, float dataPoint)
{
    // parse the equation string and figure out how to do the math
    // lots of messy code here...
}

たときの処理boatloadsのデータポイントご紹介しますといったオーバーヘッド。私は翻訳することができるようになる方程式への機能は、フライでのみ使用され、構文解析には使用されます。ストとの同時購入で今ならこのようなもの:

FunctionPointer foo = ConvertEquationToCode(equation);
....
x = foo(x);  // I could then apply the equation to my incoming data like this

機能ConvertEquationToCodeい構文解析の方程式を返すポインタ機能を応用し、適切なmath.

このアプリは基調的には書く新しいコードです。こんなことが可能なのです。います。

役に立ちましたか?

解決

有!使用方法に Microsoft.圧倒的な支持を得, システム。CodeDom.コンパイラ, は、 システム。反射 名前空間です。ここでは、簡単なコンソールアプリを編集する授業("SomeClass")の一手法("Add42")、そのときに呼び出する方法です。これは植物庭園、ボージョワーの例ではそのフォントを防止スクロールバーから登場し、コードの表示になります。なる,新しいコードです。

using Microsoft.CSharp;
using System;
using System.CodeDom.Compiler;
using System.Reflection;

namespace RuntimeCompilationTest {
    class Program
    {
        static void Main(string[] args) {
            string sourceCode = @"
                public class SomeClass {
                    public int Add42 (int parameter) {
                        return parameter += 42;
                    }
                }";
            var compParms = new CompilerParameters{
                GenerateExecutable = false, 
                GenerateInMemory = true
            };
            var csProvider = new CSharpCodeProvider();
            CompilerResults compilerResults = 
                csProvider.CompileAssemblyFromSource(compParms, sourceCode);
            object typeInstance = 
                compilerResults.CompiledAssembly.CreateInstance("SomeClass");
            MethodInfo mi = typeInstance.GetType().GetMethod("Add42");
            int methodOutput = 
                (int)mi.Invoke(typeInstance, new object[] { 1 }); 
            Console.WriteLine(methodOutput);
            Console.ReadLine();
        }
    }
}

他のヒント

だがしてみてください: Calculator.Net

で評価数学表現です。

から投稿しましたの

MathEvaluator eval = new MathEvaluator();
//basic math
double result = eval.Evaluate("(2 + 1) * (1 + 2)");
//calling a function
result = eval.Evaluate("sqrt(4)");
//evaluate trigonometric 
result = eval.Evaluate("cos(pi * 45 / 180.0)");
//convert inches to feet
result = eval.Evaluate("12 [in->ft]");
//use variable
result = eval.Evaluate("answer * 10");
//add variable
eval.Variables.Add("x", 10);            
result = eval.Evaluate("x * 10");

ダウンロードページ 配布のBSDライセンスです。

ええ、も可能で、ユーザータイプC#テキストボックス、そしてコンパイルするコードを実行しまから内のアプリです。そのために仕事をするためのカスタムビジネスロジック

ここにはいない以上の脱脂)にするべき:

http://www.c-sharpcorner.com/UploadFile/ChrisBlake/RunTimeCompiler12052005045037AM/RunTimeCompiler.aspx

の作成を行うこともできます。形式をサポートしています。XPath.XPathNavigatorから空,"ダミー"XML、ストリーム 評価を利用した表現は、XPathの評価

static object Evaluate ( string xp )
{
  return _nav.Evaluate ( xp );
}
static readonly System.Xml.XPath.XPathNavigator _nav
  = new System.Xml.XPath.XPathDocument (
      new StringReader ( "<r/>" ) ).CreateNavigator ( );

場合は登録したい変数を内部での利用につき意見を表明 でき、動的に構築XMLることで渡すことができますの評価の過負荷 を取るXPathNodeIterator.

<context>
  <x>2.151</x>
  <y>231.2</y>
</context>

すでに一時的に保存してから表現のように"x/2*0.07914"、そしてx の値であノードにXMLコンテキストのものは、すべてのXPathのコア機能 る数学および文字列の操作方法は、あります。

を取得しようとする者に対してでさらにきめXsltCustomContext(または病気の後この需要) できる解決への参照の拡張機能と変数

object result = Evaluate ( "my:func(234) * $myvar" );

私:funcにマップされなデザインインタフェース.ネット方式をダブルまたはintにパラメータとしてmyvarとして登録された変数のXSLT。

です久しぶりに会う幼なじみや同級生からCodeDomまたはラムダ仕様の表現。と思うどちらか一方を許可すべきります。表現の木のようにするとともにより高い学習曲線。

もちろん、この利用CSharpCodeProviderを作成し、そのボイラープレートクラス、機能物として定数の文字列内に発電機のクラスです。その後に挿入したユーザコード、ボイラープレートおよびコンパイル。

でかなり簡単なものへの危険性このアプローチは、ユーザの入力の方程式が入っき意見を表明するものではなく、セキュリティ問題によってはをご覧いただけます。

セキュリティはすべて、私の使用をおすすめすラムダ式の木がない場合は、CSharpCodeProviderはかなり強固なオプションです。

ていただき こちらの やん車がとても早いことが気に入ってい Boo 変更可能なご要望にお応えします。このまま統合 LUAます。当期純.いずれも活用することに体内での代用 ConvertEquationToCode.

見たことがありま http://ncalc.codeplex.com ?

で伸ばせる、など独自のキャッシュ)に提供することが可能となカスタム機能varaibles実行時のお取り扱いEvaluateFunction/EvaluateParameterます。例では表現できる解析:

Expression e = new Expression("Round(Pow(Pi, 2) + Pow([Pi2], 2) + X, 2)"); 

  e.Parameters["Pi2"] = new Expression("Pi * Pi"); 
  e.Parameters["X"] = 10; 

  e.EvaluateParameter += delegate(string name, ParameterArgs args) 
    { 
      if (name == "Pi") 
      args.Result = 3.14; 
    }; 

  Debug.Assert(117.07 == e.Evaluate()); 

でも取り扱っていますunicode&多くのデータ型のネイティブ.で鹿角のファイルを変更したい場合は、文法.もあり、フォークを支えるMEFします。

みVici.パーサー: ダウンロードはこちら(無料) では、最も柔軟な発現パーサ/評価者がその場で発音を確認することがでます。

ドがクラスのシステム。反射を生み出します。光名前空間が使用できる新しいアセンブリ、クラス。

利用できる system.CodeDom をコードをコンパイルでの 見 こちらの

きを実施 postfixのスタック電卓.基本的には何とがたくさんあります。変換を表現postfixの表記、それに対して繰り返し処理を実行でのトークンをおpostfixをを算出いたします。

この時代の図書館のための簡単な表現は:システム。Linq.ダイナミックに変化します。ます。で対応します。純標準/.NETコアでの利用を通じてNuGet、ソースが使用可能です。

https://system-linq-dynamic-core.azurewebsites.net/html/de47654c-7ae4-9302-3061-ea6307706cb8.htm https://github.com/StefH/System.Linq.Dynamic.Core https://www.nuget.org/packages/System.Linq.Dynamic.Core/

これは非常に軽量で動図書館があります。

書いた簡易ラッパークラスをこのライブラリこのようなもののようになります:

  string sExpression = "(a == 0) ? 5 : 10";
  ExpressionEvaluator<int> exec = new ExpressionEvaluator<int>(sExpression);
  exec.AddParameter("a", 0);
  int n0 = exec.Invoke();

一度に表現するときは、更新パラメータ値を再起動します。

っていて再帰的に機能しないコードを書く適用の基本の事業者への部分文字列に基づく特殊文字がこの文字列になります。複数の特殊文字が見つかるので、この間の文字列との通話にも、それらのものをいいます。

わからない場合で実施 ConvertEquationToCode 機能-しかし、形を生成することができますデータ構造を表現する計算に必要なものです。

たとえば、構築ツリーは葉ノードの入力のための計算は、葉以外のノードを表すの中間結果、ルートノードの全体計算します。

での強みがあります。例えば、だいことをやるという場合、分析は、変更したいの値入力時にできる算定結果に依存する値を変更あるいは、結果となります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top