سؤال

هذا السؤال لديه بالفعل إجابة هنا:

أحاول إنشاء بعض التعليمات البرمجية في وقت التشغيل حيث أضع بعض العناصر النموذجية ويُسمح للمستخدم بإدخال رمز العمل الفعلي.يبدو رمز لوحة الغلايات الخاص بي كما يلي:

using System;

public class ClassName
{
    public double TheFunction(double input)
    {
        // user entered code here
    }
}

من الناحية المثالية، أعتقد أنني أريد استخدام string.Format لإدراج رمز المستخدم وإنشاء اسم فئة فريد، ولكنني أحصل على استثناء في سلسلة التنسيق ما لم تبدو كما يلي:

string formatString = @"
using System;

public class ClassName
{0}
    public double TheFunction(double input)
    {0}
        {2}
    {1}
{1}";

ثم أقوم باستدعاء string.Format مثل هذا:

string entireClass = string.Format(formatString, "{", "}", userInput);

هذا أمر جيد ويمكنني التعامل مع قبح استخدام {0} و{1} في سلسلة التنسيق بدلاً من الأقواس المتعرجة، فيما عدا أنه الآن لا يمكن لإدخال المستخدم الخاص بي استخدام الأقواس المتعرجة أيضًا.هل هناك طريقة للهروب من الأقواس المتعرجة في سلسلة التنسيق الخاصة بي، أو طريقة جيدة لتحويل الأقواس المتعرجة في كود المستخدم إلى {0} و{1}؟

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

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

المحلول

الهروب منهم عن طريق مضاعفتهم:

string s = String.Format("{{ hello to all }}");
Console.WriteLine(s); //prints '{ hello to all }'

من http://msdn.microsoft.com/en-us/netframework/aa569608.aspx#Question1

نصائح أخرى

"{{" و "}}"

ما أعتقد أنك تريده هو هذا...

string formatString = @"
using System;

public class ClassName
{{
    public double TheFunction(double input)
    {{
        {0}
    }}
}}";

string entireClass = string.Format(formatString, userInput);

مضاعفة الأقواس: string.Format("{{ {0} }}", "Hello, World"); سوف تنتج { Hello, World }

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

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