أفضل طريقة لاختبار ما إذا كان النوع العام عبارة عن سلسلة؟(ج#)

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

  •  09-06-2019
  •  | 
  •  

سؤال

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

T createDefault()
{
    if(typeof(T).IsValueType)
    {
        return default(T);
    }
    else
    {
        return Activator.CreateInstance<T>();
    }
}

المشكلة - السلسلة ليست نوع قيمة، ولكنها لا تحتوي على مُنشئ بدون معلمات.إذن الحل الحالي هو:

T createDefault()
{
    if(typeof(T).IsValueType || typeof(T).FullName == "System.String")
    {
        return default(T);
    }
    else
    {
        return Activator.CreateInstance<T>();
    }
}

ولكن هذا يبدو وكأنه خبث.هل هناك طريقة أفضل للتعامل مع حالة السلسلة؟

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

المحلول

ضع في اعتبارك أن القيمة الافتراضية (string) فارغة وليست string.Empty.قد ترغب في حالة خاصة في التعليمات البرمجية الخاصة بك:

if (typeof(T) == typeof(String)) return (T)(object)String.Empty;

نصائح أخرى

if (typeof(T).IsValueType || typeof(T) == typeof(String))
{
     return default(T);
}
else
{
     return Activator.CreateInstance<T>();
}

لم يتم اختبارها، ولكن أول ما يتبادر إلى الذهن.

يمكنك استخدام ال كود نوع تعداد.قم باستدعاء أسلوب GetTypeCode على الفئات التي تطبق واجهة IConvertible للحصول على رمز النوع لمثيل تلك الفئة.يتم تطبيق IConvertible بواسطة Boolean وSByte وByte وInt16 وUInt16 وInt32 وUInt32 وInt64 وUInt64 وSingle وDouble وDecimal وDateTime وChar وString، بحيث يمكنك التحقق من الأنواع البدائية باستخدام هذا.مزيد من المعلومات حول "فحص النوع العام".

أنا شخصياً أحب طريقة التحميل الزائد:

public static class Extensions { 
  public static String Blank(this String me) {      
    return String.Empty;
  }
  public static T Blank<T>(this T me) {      
    var tot = typeof(T);
    return tot.IsValueType
      ? default(T)
      : (T)Activator.CreateInstance(tot)
      ;
  }
}
class Program {
  static void Main(string[] args) {
    Object o = null;
    String s = null;
    int i = 6;
    Console.WriteLine(o.Blank()); //"System.Object"
    Console.WriteLine(s.Blank()); //""
    Console.WriteLine(i.Blank()); //"0"
    Console.ReadKey();
  }
}

المناقشة الخاصة بالسلسلة لا تعمل هنا.

كان عليّ أن أمتلك التعليمات البرمجية التالية للأدوية حتى تعمل -

   private T createDefault()
    { 

        {     
            if(typeof(T).IsValueType)     
            {         
                return default(T);     
            }
            else if (typeof(T).Name == "String")
            {
                return (T)Convert.ChangeType(String.Empty,typeof(T));
            }
            else
            {
                return Activator.CreateInstance<T>();
            } 
        } 

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