سؤال

هذا السؤال سبق الجواب هنا:

نحن بحاجة إلى تقييم قيمة في كائن في وقت التشغيل بينما لدينا النصي بيان الدقيق الأعضاء المسار على سبيل المثال: myobject.firstMember.secondMember[3].النص
فكرنا في تحليل هذا النص بيان باستخدام التعابير المنطقية ومن ثم تقييم قيمة النص باستخدام انعكاس ولكن قبل أن نفعل ذلك أنا أتساءل عما إذا كان C# دعم بعض نوع من eval القدرة ؟ لذلك نحن لا يجب أن تفعل تحليل نفسي.كيف مايكروسوفت تفعل هذا في الإطار الحالي أو مشاهدة ويندوز ؟

شكرا جزيلا ،

عدي بارده

هل كانت مفيدة؟

المحلول

ربما تكون أسهل طريقة هي الاستخدام DataBinder.Eval من System.Web.UI:

var foo = new Foo() { Bar = new Bar() { Value = "Value" } };
var value = DataBinder.Eval(foo, "Bar.Value");

نصائح أخرى

لقد قمت بكتابة مشروع مفتوح المصدر، ديناميكي اكسبريسو, ، والتي يمكنها تحويل التعبير النصي المكتوب باستخدام بناء جملة C# إلى مفوضين (أو شجرة تعبير).يتم تحليل التعبيرات وتحويلها إلى أشجار التعبير دون استخدام التجميع أو التفكير.

يمكنك كتابة شيء مثل:

var interpreter = new Interpreter();
var result = interpreter.Eval("8 / 2 + 2");

أو

var interpreter = new Interpreter()
                .SetVariable("service", new ServiceExample());

string expression = "x > 4 ? service.SomeMethod() : service.AnotherMethod()";

Lambda parsedExpression = interpreter.Parse(expression, 
                        new Parameter("x", typeof(int)));

parsedExpression.Invoke(5);

يعتمد عملي على مقال سكوت جو http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx .

في المستقبل (حول 5.0 الزمني) ، "مترجم كخدمة" قد تكون قادرة على القيام بذلك.في الواقع, كنت قد تكون قادرة على أن تفعل الكثير من هذا الآن مع "مونو" (انظر CsharpRepl و أحادية.CSharp - ومع ذلك أتوقع أنه سوف تحتاج إلى معرفة الكثير عن السياق إلى أن تكون قادرة على استخدام المتغيرات المحلية وغيرها في Evaluate) - ولكن ليس هناك أي دعم في هذا الحالية MS .صافي تقدم.

الآن عليك أن تفعل شيئا مثل ما الكثير من ربط البيانات المدونة...تقسيمه عن طريق الرموز مثل "." واستخدام التفكير.بالمعنى الدقيق للكلمة ، ملزمة رمز يستخدم في الواقع TypeDescriptor/PropertyDescriptor بدلا من انعكاس مباشر ، ولكن النتيجة هي نفسها.

على الرغم من أنه نهج ثقيل الوزن إلى حد ما، إلا أنه يمكنك استخدام C# CodeDom لإصدار تجميع جديد يحتوي على طريقة تحتوي فقط على هذا السطر من التعليمات البرمجية.

أعترف أن هذا أكثر تعقيدًا من بعض الاقتراحات الأخرى، ولكن من ناحية أخرى، فإنك تسمح لمحلل لغة C# بالقيام بالمهمة الثقيلة، لذلك يجب أن يكون قادرًا على التعامل مع كل ما تقدمه طالما أنه صالح لـ C# .

إذا سلكت هذا الطريق، فستحتاج أيضًا إلى التأكد من أنه يمكنك إلغاء تحميل التجميع المنبعث مرة أخرى، لذلك قد يكون إنشاء AppDomains وإلغاء تحميله ضروريًا.

لقد قمت بتنفيذ واستخدام التقنية المذكورة أعلاه بنجاح.من ناحية أخرى، إذا كنت تستطيع استخدام طريقة ديناميكية سيكون خفيف الوزن أكثر بكثير.ومع ذلك، لم أجرب هذا الأسلوب مطلقًا، لذلك لا أستطيع أن أقول ما إذا كان بإمكانك تنفيذ نص DynamicMethod باستخدام حرف C#.

في الواقع، يمكن لميزة محرك تقييم التعبير والقواعد في Windows Workflow Foundation القيام بأشياء مثل هذه.يرى مقدمة إلى محرك القواعد الأساسية لسير العمل في Windows.

أحد الأشياء المثيرة للاهتمام حول هذه المكونات هو أنها تم تصميمها بحيث يمكنك استضافة مكونات وقت التصميم في تطبيقاتك الخاصة لتصميم مجموعات من القواعد و/أو التعبيرات التي تعمل في سياق الفئات المخصصة الخاصة بك.على سبيل المثال، ستطلب منه تصميم تعبير مقابل "myObject"، وسيعرف أن هناك عضوًا أولًا يحتوي على عضو ثانٍ يحتوي على مفهرس ينتج عنه نوع يحتوي على خاصية نصية.يمكنك الاحتفاظ بالتعبيرات والقواعد كـ XML، وقراءتها مرة أخرى في وقت التشغيل، دون الحاجة إلى استخدام المصمم في وقت التشغيل.

على وجه الخصوص، راجع نموذج مجموعة أدوات مجموعة القواعد الخارجية.

لسوء الحظ، لا تحتوي لغة C# على أي تسهيلات أصلية للقيام بما تطلبه بالضبط.

ومع ذلك، فإن برنامج تقييم C# الخاص بي يسمح بتقييم كود C#.يوفر تقييم كود C# في وقت التشغيل ويدعم العديد من عبارات C#، بما في ذلك تعبيرات مثل "myobject.firstMember. SecondMember[3].text".في الواقع، هذا الرمز قابل للاستخدام ضمن أي مشروع .NET، ومع ذلك، فهو يقتصر على استخدام بناء جملة C#.قم بإلقاء نظرة على موقع الويب الخاص بي، http://csharp-eval.com, ، للحصول على تفاصيل إضافية.

يمكنك دائمًا تجربة برنامج C# Eval خفيف الوزن.يقوم بتجميع مجموعة فرعية كبيرة من لغة C# إلى أساليب ديناميكية.التفاصيل الكاملة على مستودع GitHub الخاص بي ديفيد وين / CSharpEval

AFAIK لا توجد مثل هذه الوظيفة التقييمية المضمنة.سيتعين عليك اتباع طريقة Regex+Reflection.وأعتقد أيضًا أن Visual Studio يفعل الشيء نفسه.

إليك شيئًا مشابهًا أستخدمه للعثور على الخصائص المتداخلة ديناميكيًا..ستحتاج إلى إضافة منطق الفهارس ...وبعض التدقيق الإضافي ...ألتقط القيم الخالية/الأخطاء في طريقة الاتصال الخاصة بي ...

  public static object FindDottedProperty(this object input, string propertyName)
  {
    if (input == null)
      return null;

    if (string.IsNullOrEmpty(propertyName))
      return null;

    Queue props = new Queue(propertyName.Split('.'));
    if (props.Count == 0) return null;

    //start with input object and roll out property stack from there.
    object ret = input;
    while (props.Count > 0)
    {
      var prop = props.Dequeue();
      if (string.IsNullOrEmpty(prop)) return null;

      /*** ADD INDEXER LOGIC HERE ***/

      //get the property's value based on the current named item
      ret = ret.GetType().GetProperty(prop).GetValue(ret, null);

      if (null.Equals(ret)) return null;
    }

    //return looked up value
    return ret;
  }
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top