IList.الزهر<typeof(T)>() بإرجاع خطأ في بناء الجملة يبدو موافق

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

سؤال

public static IList<T> LoadObjectListAll<T>()
{
    ISession session = CheckForExistingSession();
    var cfg = new NHibernate.Cfg.Configuration().Configure();
    var returnList = session.CreateCriteria(typeof(T));
    var list = returnList.List();
    var castList = list.Cast<typeof(T)>();
    return castList;
}

إذا أنا على خطأ بناء أين أنا الصب "قائمة" عنصرا عام IList ....أي شخص يمكن أن نرى الخطأ الفادح هنا ؟

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

المحلول

T ليس نوع ولا System.Type. T هو نوع المعلمة. typeof(T) إرجاع نوع من T.على typeof المشغل لا يعمل على كائن ، فإنها ترجع Type كائن من نوع. http://msdn.microsoft.com/en-us/library/58918ffs.aspx

@جون هو الصحيح في الإجابة على سؤال مباشر.ولكن NHibernate هو قليلا قبالة.لا يجب أن يكون تكوين ISessionFactory بعد الحصول على ISession, على سبيل المثال.

public static T[] LoadObjectListAll()
{
    var session = GetNewSession();
    var criteria = session.CreateCriteria(typeof(T));
    var results = criteria.List<T>();
    return results.ToArray();        
}

نصائح أخرى

أعتقد

var castList = list.Cast<typeof(T)>();

يجب أن يكون

var castList = list.Cast<T>();

@جون Limjap أبرز خطأ أراه هو أن IList هو بالتأكيد مختلفة من IList<T>.وهو IList هو غير عام (على سبيل المثال ، ArrayList).

كان السؤال الأصلي بالفعل IList<T>.تمت إزالته عند شخص تحريرها التنسيق.على الأرجح مشكلة مع تخفيض السعر.

ثابت الآن.

على IList هو IList<T>انه فقط حصلت fubared عن طريق تخفيض السعر عندما نشرت ذلك.حاولت تنسيق ذلك ، ولكن فاتني الهروب <T>..تحديد ذلك الآن.

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

أن يقرأ مثل سلسلة ماركوف...برافو.

T هو بالفعل نوع المعلمة, أنت لا تحتاج إلى استدعاء تشير typeof على ذلك.تشير TypeOf يأخذ نوع إرجاع نوع المعلمة.

"كان السؤال الأصلي بالفعل IList<T>.تمت إزالته عند شخص تحريرها التنسيق.على الأرجح مشكلة مع تخفيض السعر."

هذا ما رأيت ولكن تم تحريرها من قبل شخص ما وهذا هو السبب في أنني أضع شرحا عن التغاير ولكن لسبب ما تميزت وصولا إلى -1.

لديك الكثير من المتغيرات المؤقتة التي هي مربكة

بدلا من

var returnList = session.CreateCriteria(typeof(T));
var list = returnList.List();
var castList = list.Cast<typeof(T)>();
return castList;

فقط تفعل

return session.CreateCriteria(typeof(T)).List().Cast<T>();

@جوناثان هولندا

T هو بالفعل نوع المعلمة, أنت لا تحتاج إلى استدعاء تشير typeof على ذلك.تشير TypeOf يأخذ نوع إرجاع نوع المعلمة.

typeof "يأخذ" نوع ويعود لها System.Type

CLI فقط يدعم عامة الحجج التغاير و contravariance عند استخدام المندوبين ، ولكن عند استخدام الأدوية هناك بعض القيود ، على سبيل المثال ، يمكنك تحويل سلسلة إلى كائن لذلك معظم الناس سوف نفترض أن كنت يمكن أن تفعل الشيء نفسه مع List<string> إلى List<object> ولكن لا يمكنك أن تفعل ذلك لأنه لا يوجد التغاير بين المعلمات عامة ومع ذلك يمكنك محاكاة التغاير كما يمكنك أن ترى في هذا المادة.حيث أن ذلك يعتمد على نوع وقت التشغيل التي يتم إنشاؤها من قبل مصنع مجردة.

@جون @جوناثان هو الصحيح, ولكن عليك أيضا أن تغيير نوع الإرجاع إلى

IList<T>

أيضا.إلا أن مجرد تخفيض السعر علة.

@جوناثان, فكرت أن هذا هو الحال.

لست متأكدا ما هو إصدار nHibernate تستخدمه.لم أحاول الذهب الإصدار 2.0 حتى الآن, ولكن هل يمكن تنظيف طريقة بعض, من خلال إزالة بعض الخطوط:

public static IList<T> LoadObjectListAll()
{
    ISession session = CheckForExistingSession();
    // Not sure if you can configure a session after retrieving it.  CheckForExistingSession should have this logic.
    // var cfg = new NHibernate.Cfg.Configuration().Configure();
    var criteria = session.CreateCriteria(typeof(T));
    return criteria.List<T>();
}

أبرز خطأ أراه هو أن IList هو بالتأكيد مختلفة من IList<T>.وهو IList هو غير عامة (على سبيل المثال ، ArrayList).

حتى طريقة التوقيع يجب أن تكون:

public static IList<T> LoadObjectListAll()
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top