سؤال

في C# هل هناك طريقة الاختزال لكتابة هذا:

public static bool IsAllowed(int userID)
{
    return (userID == Personnel.JohnDoe || userID == Personnel.JaneDoe ...);
}

مثل:

public static bool IsAllowed(int userID)
{
    return (userID in Personnel.JohnDoe, Personnel.JaneDoe ...);
}

وأنا أعلم أنني يمكن أيضا استخدام مفتاح, ولكن ربما يكون هناك 50 أو حتى وظائف مثل هذا يجب أن تكتب (ترقية الكلاسيكية موقع ASP أكثر ASP.NET) لذا أود الاحتفاظ بها قصيرة قدر الإمكان.

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

المحلول

ماذا عن هذا ؟

public static class Extensions
{
    public static bool In<T>(this T testValue, params T[] values)
    {
        return values.Contains(testValue);
    }
}

الاستخدام:

Personnel userId = Personnel.JohnDoe;

if (userId.In(Personnel.JohnDoe, Personnel.JaneDoe))
{
    // Do something
}

أنا لا يمكن أن يدعي الفضل في هذا, ولكن أنا أيضا لا أستطيع أن أتذكر أين رأيت ذلك.لذا الائتمان ، مجهول الإنترنت غريب.

نصائح أخرى

ماذا عن شيء مثل هذا:

public static bool IsAllowed(int userID) {
  List<int> IDs = new List<string> { 1,2,3,4,5 };
  return IDs.Contains(userID);
}

(يمكنك بالطبع تغيير حالة ثابتة ، تهيئة معرفات فئة في مكان آخر ، IEnumerable<> وما إلى ذلك ، على أساس الاحتياجات الخاصة بك.النقطة الرئيسية هي أن أقرب ما يعادل في مشغل في SQL هو جمع.يحتوي على وظيفة ().)

أود أن تغلف قائمة سمح معرفات البيانات لا رمز.ثم إنه مصدر يمكن تغييرها بسهولة في وقت لاحق.

List<int> allowedIDs = ...;

public bool IsAllowed(int userID)
{
    return allowedIDs.Contains(userID);
}

في حالة استخدام .NET framework 3.5 يمكنك استخدام IEnumerable بدلا من List بفضل أساليب الإرشاد.

(هذه الوظيفة لا ينبغي أن تكون ثابتة.ترى هذا المنشور: استخدام الكثير من ساكنة جيدة أو سيئة ؟ .)

هي أذونات المستخدم ؟ إذا كنت قد ينتهي مع حل أفضل من خلال الذهاب من دور أساس الأذونات.أو قد ينتهي الحاجة إلى تعديل هذا الأسلوب كثيرا جدا لإضافة مزيد من المستخدمين إلى "يسمح للمستخدمين" قائمة.

على سبيل المثال ، التعداد UserRole { المستخدم مسؤول LordEmperor }

class User {
    public UserRole Role{get; set;}
    public string Name {get; set;}
    public int UserId {get; set;}
}

public static bool IsAllowed(User user) {
    return user.Role == UserRole.LordEmperor;
}

خدعة صغيرة لطيفة هي نوع من عكس الطريقة التي تستخدمها عادة .يحتوي على () مثل:-

public static bool IsAllowed(int userID) {
  return new int[] { Personnel.JaneDoe, Personnel.JohnDoe }.Contains(userID);
}

حيث يمكنك وضع العديد من القيود في مجموعة كما تريد.

إذا كان الأفراد.x هو التعداد يجب صب بعض القضايا مع هذا (مع رمز الأصلي الذي نشر) ، وفي هذه الحالة سيكون من الأسهل استخدام:-

public static bool IsAllowed(int userID) {
  return Enum.IsDefined(typeof(Personnel), userID);
}

هنا أقرب ما أستطيع أن أفكر:

using System.Linq;
public static bool IsAllowed(int userID)
{
  return new Personnel[]
      { Personnel.JohnDoe, Personnel.JaneDoe }.Contains((Personnel)userID);
}

يمكن أن تكتب مكرر للأفراد.

public static bool IsAllowed(int userID)
{
    return (Personnel.Contains(userID))
}

public bool Contains(int userID) : extends Personnel (i think that is how it is written)
{
    foreach (int id in Personnel)
        if (id == userid)
            return true;
    return false;
}

مجرد فكرة بناء الجملة:

return new [] { Personnel.JohnDoe, Personnel.JaneDoe }.Contains(userID);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top