سؤال

لدي فئة Repository<T> عامة أريد استخدامها مع ObjectDataSource.يوجد Repository<T> في مشروع منفصل يسمى DataAccess.وفق هذا المنشور من مجموعات أخبار MS (تم نسخ الجزء ذي الصلة أدناه):

داخليًا ، يكون ObjectDataSource هو استدعاء type.getType (سلسلة) للحصول على النوع ، لذلك نحتاج إلى اتباع المبدأ التوجيهي الموثقة في type.getType حول كيفية الحصول على الكتابة باستخدام الأدوية الجماهيرية.يمكنك الرجوع إلى مكتبة MSDN على Type.GetType:

http://msdn2.microsoft.com/en-us/library/w3f99sx1.aspx

من المستند ، سوف تتعلم أنك تحتاج إلى استخدام Backtick (`) للدلالة على اسم النوع الذي يستخدم generics.

ويجب علينا هنا أيضًا تحديد اسم التجميع في سلسلة اسم النوع.

لذا، بالنسبة لسؤالك، الإجابة هي استخدام اسم النوع كما يلي:

TypeName="TestObjectDataSourceAssembly.MyDataHandler`1[System.String],TestObjectDataSourceAssembly"

حسنًا، هذا منطقي.ومع ذلك، عندما أحاول ذلك، تطرح الصفحة استثناءً:

<asp:ObjectDataSource ID="MyDataSource" TypeName="MyProject.Repository`1[MyProject.MessageCategory],DataAccess" />

[استثناء عملية غير صالحة:تعذر العثور على النوع المحدد في خاصية TypeName الخاصة بـ ObjectDataSource 'MyDataSource'.]

الشيء الغريب هو أن هذا يحدث فقط عندما أشاهد الصفحة.عندما أفتح مربع الحوار "تكوين مصدر البيانات" من مصمم VS2008، فإنه يعرض لي بشكل صحيح الأساليب الموجودة في فئة المستودع العامة الخاصة بي.يؤدي تمرير سلسلة TypeName إلى Type.GetType() أثناء التصحيح أيضًا إلى إرجاع نوع صالح.إذن ما الذي يعطي؟

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

المحلول

افعل شيئًا كهذا.

Type type = typeof(Repository<MessageCategory);
string assemblyQualifiedName = type.AssemblyQualifiedName;

احصل على قيمة AssemblyQualifiedName والصقها في حقل TypeName.لاحظ أن القيمة التي تم تمريرها يجب أن تكون Type.GetType(string).

الاسم المؤهل للتجميع للنوع المطلوب الحصول عليه.يرى اسم المؤهل للتجميع.إذا كان النوع موجودًا في التجميع الذي يتم تنفيذه حاليًا أو في Mscorlib.dll، فإنه يكفي توفير اسم النوع المؤهل بواسطة مساحة الاسم الخاصة به.

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

على الأرجح النوع الذي تبحث عنه هو

MyProject.Repository`1[MyProject.MessageCategory, DataAccess, Version=1.0.0.0, Culture=neutral, PublicKey=null], DataAccess, Version=1.0.0.0, Culture=neutral, PublicKey=null

نصائح أخرى

أعلم أن هذا منشور قديم ولكنني واجهت هذه المشكلة مؤخرًا بنفسي.الحل الآخر هو استبدال الميراث بتركيبة الكائن، على سبيل المثال.

[DataObject]
public class DataAccessObject {
    private Repository<MessageCategory> _repository;

    // ctor omitted for clarity
    // ...

    [DataObjectMethod(DataObjectMethodType.Select)]
    public MessageCategory Get(int key) {
        return _repository.Get(key);
    }
}

بهذه الطريقة لا يعرف ObjectDataSource عن المستودع لأنه مخفي داخل الفصل.لدي مكتبة صفية في طبقة الواجهة الخاصة بي، وهي مكان معقول تمامًا لوضع هذا الكود في المشروع الذي أعمل عليه.

بالإضافة إلى ذلك، إذا كنت تستخدم Resharper والواجهات، فمن الممكن أن تجعل Resharper يقوم بإعادة البناء باستخدام وظيفة Resharpers "التنفيذ باستخدام الحقل".

دارين،

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

MyProject.Repository`1[[MyProject.MessageCategory، DataAccess، الإصدار=1.0.0.0، الثقافة=محايدة، PublicKey=null]]، DataAccess، الإصدار=1.0.0.0، الثقافة=محايدة، PublicKey=null

حاضر

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