كيف يمكنك التحقق من صحة سلسلة التنسيق المركبة في C# مقابل أنواع الوسائط المستهدفة؟

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

  •  22-08-2019
  •  | 
  •  

سؤال

نظرًا لسلسلة تنسيق مركبة يقدمها المستخدم (للاستخدام مع String.Format) ومجموعة من الأنواع التي تمثل الوسائط التي سيتم استخدامها لتنسيق سلسلة التنسيق المركبة، كيف يمكنك التحقق من صحة القيمة المقدمة من المستخدم؟

يجب أن يكون من السهل جدًا إنشاء تعبير عادي للتحقق من تطابق الصيغة العامة للعناصر النائبة للوسيطات "{index[,alignment][:formatString]}"لكل وثائق.وليس من الصعب جدًا التحقق من أن فهارس العناصر النائبة في سلسلة التنسيق المركبة أقل من العدد الفعلي للوسائط المكتوبة (أي.لا يشيرون إلى حجة لن يتم تقديمها).ومع ذلك، نظرًا لأن أنواع الوسائط التي سيتم تمريرها معروفة، فمن الممكن أيضًا التحقق من صحة ":formatString"مناسب لتلك الأنواع.

على سبيل المثال، تريد التحقق من أن المستخدم لا يحدد "{0:dddd MMMM}" كسلسلة تنسيق عندما يكون نوع الوسيطة الأول (0 فهرس) رقمًا (String.Format("{0:dddd MMMM}", 1234) عائدات "dddd MMMM").الكمية ":formatString"الخيارات حسب النوع هي كبير جدًا تريد التحقق من كل شيء يدويًا.هل هناك أي طريقة أخرى؟أو هل يتعين عليك فقط التعايش مع احتمال قيام المستخدم بتحديد سلسلة تنسيق سيئة؟

لنفترض أنه لا يوجد عرف IFormatProvider, ICustomFormatter أو IFormattable التنفيذ في اللعب هنا.فقط الأنواع الأساسية الموجودة بالفعل في .NET Framework.نقاط المكافأة لمعالجة الأشياء المخصصة.

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

المحلول

لا توجد طريقة مدمجة للقيام بذلك، AFAIK.

يمكنك ترميز كل حالة شائعة يدويًا، لكنني لا أوصي بذلك.

(يحرر) قد يكون أحد الخيارات العملية try/catch - اختبر التنسيق في أقرب وقت ممكن عندما يقوم المستخدم بإدخاله....

نصائح أخرى

وعذرا، ولكن طريقة للقيام بذلك هي:

try { string.Format(godKnowsWhat, aBunchOfArguments); }
catch(FormatException) { // use exception for control flow lol }

نعم، سيئة نوعا ما.

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

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