سؤال

أحاول استخدام شجرة التعبير وكائنات Lamdba Expression في .Net 3.5 للسماح لي بحساب التعبير المنطقي الذي أدخله المستخدم ديناميكيًا.

حتى الآن يمكن للمستخدم إنشاء شجرة تعبير تتكون من BinarayExpressions يتم التعبير عن قيم AND و OR كـ ParameterExpressions.كنت أخطط بعد ذلك لإنشاء ملف LambdaExpression بناءً على تلك الشجرة حتى أتمكن من تجميع التعبير في مندوب يمكنني الاتصال به بعد ذلك.المشكلة التي أواجهها هي أنني لا أعرف عدد معلمات الإدخال التي سيحتاجها المستخدم، لذلك عندما أقوم بتجميع التعبير إلى مفوض، لا أعرف الطريقة التي يجب أن يكون عليها توقيع الطريقة حتى وقت التشغيل.

لقد توصلت حتى الآن إلى حلين محتملين.

  1. Create a whole bunch of delegates like the Func<bool, bool, bool...> لا يبدو أن هذا هو الحل الأكثر أناقة ولكني أعتقد أنه سينجح، حتى يرغب شخص ما في استخدام معلمة واحدة إضافية عما قمت بتلبيته.
  2. قم بتمرير مجموعة من القيم وقم بتعيينها بطريقة ما إلى المعلمات الخاصة بي باستخدام مفهرس المصفوفة.لقد فكرت في هذا ولكن لا أستطيع معرفة كيفية عمله.

ملحوظة:يجب أن يكون الأمر سريعًا، لذا لا توجد ملاكمة أو أي شيء من هذا القبيل.

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

المحلول

فعلتُ بالضبط هذا من قبل، باستخدام نهج المصفوفة (ل اللغويات, ، كما يحدث).الحيلة هي Expression.ArrayIndex:

    var arr = Expression.Parameter(typeof(int[]), "arr");
    var body = Expression.ArrayIndex(arr, Expression.Constant(1));
    var expr = Expression.Lambda<Func<int[], int>>(body, arr);
    var func = expr.Compile();

    int[] vals = { 7, 8, 9 };
    int i = func(vals);

تتمثل ميزة أسلوب المصفوفة في أنه يمكنك الاحتفاظ بنوع المفوض المكتوب بقوة (Func<int[],int> أو ما شابه ذلك، بغض النظر عن عدد الحجج.وكتبت Invoke أسرع بكثير من DynamicInvoke.

إذا لم تكن جميع القيم من نفس النوع - فهذا ممكن أيضًا؛اسمحوا لي أن أعرف وسأضيف مثالا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top