كيفية تحديد اسم المعلمة برمجياً عند إنشاء ArgumentException؟

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

سؤال

عند إنشاء ArgumentException، تأخذ بعض التحميلات الزائدة سلسلة تمثل اسم معلمة الوسيطة غير الصالحة.أعتقد أنه سيكون من الجيد ألا أضطر إلى تذكر تحديث معلمة ctor هذه عندما أقوم بتغيير اسم معلمة الطريقة.هل هناك طريقة بسيطة للقيام بذلك باستخدام التأمل؟

تحديث: شكرا للمجيبين 2 حتى الآن.كلاكما تجيبان على السؤال جيدًا، لكن الحل ما زال يسبب لي صداع الصيانة.(حسنا، أ صغير الحجم الصداع، ولكن لا يزال...) للتوضيح، إذا كان لي أن إعادة ترتيب المعلمات لاحقًا - أو إزالة معلمة سابقة - يجب أن أتذكر تغيير كود بناء الاستثناء الخاص بي مرة أخرى.هل هناك طريقة يمكنني من خلالها استخدام شيء ما على غرار

Object.ReferenceEquals(myParam, <insert code here>)

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

ومع ذلك، بدأت أشك في أن الجزء "البسيط" من السؤال الأصلي ليس بهذه البساطة.ربما ينبغي لي أن أتحمل استخدام السلسلة الحرفية.:)

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

المحلول

التأمل ليس مناسبًا لهذا.

سيتعين عليك تحمل التذكر حتى تتمكن من القيام بذلك بشكل صحيح.

لحسن الحظ، سيساعدك FxCop (أو تحليل كود نظام الفريق) من خلال الإشارة إلى أي عدم تطابق.

نصائح أخرى

يمكنك استخدام شجرة التعبير لهذا، والتي سوف تحصل على ما تريد على حساب بعض تركيب الجملة الفردية.على سبيل المثال

public void Resize(int newSize)
{
  if (newSize < 1)
  {
    throw new ArgumentException("Blah", NameOfVariable(() => newSize));
  }
  // ... whatever ...
}

حيث يتم تعريف NameOfVariable على النحو التالي:

public static string NameOfVariable(Expression<Func<object>> expressionTree)
{
   var expression = (UnaryExpression)expressionTree.Body;
   var memberExpression = (MemberExpression)expression.Operand;
   return memberExpression.Member.Name;
}

هذا أيضًا لديه فرصة للتعطل في وقت التشغيل إذا قمت بتمرير أي شيء آخر غير UnaryExpression إلى NameOfVariable.

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

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