سؤال

في C # 3.0 و. NET 3.5، تخيل هناك واجهة:

public interface INameable
{
  string Name {get;}
}

ووالعديد من الفئات الثابتة التي تنفذ واجهة.

وأود أن يكون لديك طريقة تمديد واحد

public static T Rename<T>(this T obj) where T : INameable
{ 
  ...
}

وترجع مثيل ملفوفة الكائن الأصلي فقط مع تغيير الاسم وجميع ممتلكات أخرى يقرأ واستدعاءات الأسلوب توجيه إلى كائن الأصلي.

وكيفية الحصول على فئة مجمع العامة لهذا، من دون تطبيقه على كل أنواع تنفيذ INameable؟ هل تعتقد أن من الممكن؟

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

المحلول

لا، لم يكن ذلك ممكنا، ما لم يتم تقييد T ليكون واجهة أو أن تكون فئة مع جميع أعضاء الظاهري، وهذا القيد ليس من الممكن تحديد في وقت الترجمة (على الرغم من أنك يمكن كتابة شيك وقت إذا كنت سعيدا مع هذا النهج).

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

public sealed class SomeClass : INameable
{
    public string Name { get; }
    public string Abc { get; }
}

... ثم لا توجد وسيلة يمكنك إنشاء نوع آخر هو تنازل لSomeClass. لا تستخدم Reflection.Emit أو أي وسيلة أخرى، لأن مختومة نوع.

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

نصائح أخرى

حسنا، نعم، فمن الممكن، ولكنه ينطوي توليد التعليمات البرمجية في الذاكرة.

ويمكنك أن تبحث في Reflection.Emit و <أ href ل = "http://msdn.microsoft.com/en-us/library/system.reflection.emit.aspx" يختلط = "نوفولو noreferrer"> هنا .

لاحظ أنه سوف تنطوي على الكثير من التعليمات البرمجية.

وهذا هو، إذا افترض كنت فهمت بشكل صحيح.

وإليك ما أعتقد كنت طالبا لل:

SomeNameableObject a1 = new SomeNameableObject("ThisIsTheFirstName");
SomeNameableObject a2 = a1.Rename("ThisIsTheSecondName");
// a1 works, still has the name ThisIsTheFirstName
// a2 works, but everything is routed to a1,
//    except for the name, which is ThisIsTheSecondName

هل هذا صحيح؟

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