2015-02-27 30 views
6

Görünüşe ITuple bir çözüm gibi typeof(ITuple).IsAssignableFrom(type) devre dışı bırakılması, dahili kullanım içindir. Alternatif olarak, Tuple<>'u Tuple<,,,,,,,> tarihine kadar belirlemenin en etkili yolu nedir? Tip adı karşılaştırması olmayan bir çözüm tercih edilir.Tuple türleri nasıl belirlenir?

+1

Ne demek "belirlemek"? Bazı nesnelerin ve onlardan öğrenmeye çalıştığınız bir örneğiniz var mı? –

+1

Doğrudan "typeof (ITuple)" özelliğini kullanamazsınız, ancak bunu almak için 'Type.GetType (" System.ITuple, mscorlib ")' işlevini kullanabilirsiniz. – Dirk

+1

@JonathonReinhart Ben bir kayıt düzeni olduğundan emin değiliz. O bir nesne var" olduğunu soran ne inanıyorum, ve türü parametreleri kullanıldı nasıl kaç bilmiyorum, ya da hatta, nelerdir eğer bir tuple ise. Nasıl kontrol edebilirim? – vcsjones

cevap

12

bu deneyin:

public static bool IsTupleType(Type type, bool checkBaseTypes = false) 
{ 
    if (type == null) 
     throw new ArgumentNullException(nameof(type)); 

    if (type == typeof(Tuple)) 
     return true; 

    while (type != null) 
    { 
     if (type.IsGenericType) 
     { 
      var genType = type.GetGenericTypeDefinition(); 
      if (genType == typeof(Tuple<>) 
       || genType == typeof(Tuple<,>) 
       || genType == typeof(Tuple<,,>) 
       || genType == typeof(Tuple<,,,>) 
       || genType == typeof(Tuple<,,,,>) 
       || genType == typeof(Tuple<,,,,,>) 
       || genType == typeof(Tuple<,,,,,,>) 
       || genType == typeof(Tuple<,,,,,,,>) 
       || genType == typeof(Tuple<,,,,,,,>)) 
       return true; 
     } 

     if (!checkBaseTypes) 
      break; 

     type = type.BaseType; 
    } 

    return false; 
} 
+0

Bu, tek güvenilir çözüm gibi görünüyor. – toplel32

+0

İkincisi, bu yöntemi daha güvenilir hale getirmek istiyorum. –

+1

'IsTypeOfTuple' için yeniden adlandırmak isteyebilirsiniz, çünkü IsTuple bir örneği ele almayı önerir. – toplel32

-1

Ben OP hiçbir türü adı karşılaştırma tercih biliyorum ama başvuru için, bir tür bir değer-lü olup olmadığını belirler bu kısa çözüm dahil ediyorum:

var x = (1, 2, 3); 

var xType = x.GetType(); 
var tType = typeof(ValueTuple); 

var isTuple = xType.FullName.StartsWith(tType.FullName) 

belirli olmak xType.Assembly == tType.Assembly ekleyebilir.