هل يمكنك استخدام "أين" لتتطلب سمة في C#؟
-
03-07-2019 - |
سؤال
أريد أن أصنع فئة عامة تقبل الفصول القابلة للتسلسل فقط ، هل يمكن أن يتم ذلك مع القيد؟
المفهوم الذي أبحث عنه هو:
public class MyClass<T> where T : //[is serializable/has the serializable attribute]
المحلول
كلا ، لا أخشى. الأشياء الوحيدة التي يمكنك القيام بها بالقيود هي:
where T : class
- يجب أن يكون T نوع مرجعيwhere T : struct
- يجب أن يكون T نوع قيمة غير قابل للفرقwhere T : SomeClass
- يجب أن يكون T someclass أو اشتق منهwhere T : ISomeInterface
- يجب أن يكون t isomeinterface أو تنفيذهwhere T : new()
- يجب أن يكون لدى T منشئًا عامًا بدون معلمة
مجموعات مختلفة ممكنة ، ولكن ليس كل شيء. لا شيء عن السمات.
نصائح أخرى
ما أعرفه ؛ لا يمكنك القيام بذلك. هل لديك على الرغم من إضافة طريقة "تهيئة" أو شيء مشابه؟
public void Initialize<T>(T obj)
{
object[] attributes = obj.GetType().GetCustomAttributes(typeof(SerializableAttribute));
if(attributes == null || attributes.Length == 0)
throw new InvalidOperationException("The provided object is not serializable");
}
لم أختبر هذا الرمز ، لكنني آمل أن تحصل على وجهة نظري.
أخشى أنه لا. أفضل ما يمكنك القيام به هو فحص وقت التشغيل type.isserializable.
إذا كنت تبحث عن أي فصل قابل للتسلسل ، أعتقد أنك غير محظوظ. إذا كنت تبحث عن كائنات قمت بإنشائها ، فيمكنك إنشاء فئة أساسية قابلة للتسلسل ولديها كل فئة تريد دعمها.
أعلم أن هذا قديم ، لكنني أستخدم مُنشئًا ثابتًا للتحقق. إنه لاحقًا ولكنه يسمح لك برمي خطأ في وقت التشغيل.