ج# - كيف يمكنني تحديد مضمنة طريقة ظائفها<T> كما معلمة ؟

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

سؤال

لقد كتبت بسيطة SessionItem إدارة الصف للتعامل مع كل تلك غذر null الضوابط إدراج القيمة الافتراضية إذا لم يوجد.هنا هو بلدي GetItem الطريقة:

public static T GetItem<T>(string key, Func<T> defaultValue)
{
    if (HttpContext.Current.Session[key] == null)
    {
        HttpContext.Current.Session[key] = defaultValue.Invoke();
    }
    return (T)HttpContext.Current.Session[key];
}

الآن كيف يمكنني استخدام هذا الواقع ، ويمر في وظائفها<T> كما مضمنة طريقة المعلمة ؟

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

المحلول

ومنذ ذلك هو ظائفها، فإن امدا يكون أبسط طريقة:

Foo foo = GetItem<Foo>("abc", () => new Foo("blah"));

وأين [جديد فو ( "بلاه")] هي ظائفها أن يتم استدعاء كقيمة افتراضية.

ويمكنك أيضا تبسيط إلى:

return ((T)HttpContext.Current.Session[key]) ?? defaultValue();

وأين ؟؟ هي المشغل خالية التحام - إذا كانت وسيطة الأول هو غير الصفرية، فإنه يتم إرجاعها. خلاف ذلك يتم تقييم اليد اليمنى وعاد (حتى لا يتم استدعاء القيمة_الافتراضية () إلا إذا كان هذا البند هو باطل).

وأخيرا، إذا كنت ترغب فقط في استخدام منشئ افتراضي، ثم هل يمكن إضافة "جديد ()" القيد:

public static T GetItem<T>(string key)
    where T : new()
{
    return ((T)HttpContext.Current.Session[key]) ?? new T();
}

وهذا لا يزال كسول - جديد () يستخدم فقط إذا كان هذا البند لاغيا

نصائح أخرى

لماذا لا يمكنك تمرير القيمة الافتراضية مباشرة؟ استخدام ما هو functor؟

وبالمناسبة، defaultValue.Invoke() هو مطول جدا. فإنه من الممكن أيضا أن مجرد كتابة defaultValue().

var log = SessionItem.GetItem("logger", () => NullLog.Instance)

ملاحظة ، من عادة يمكنك تخطي {T} مواصفات في GetItem{T} دعوة (إذا ظائفها{T} إرجاع كائن من نفس النوع)

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