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?
6
A
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;
}
-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.
Ne demek "belirlemek"? Bazı nesnelerin ve onlardan öğrenmeye çalıştığınız bir örneğiniz var mı? –
Doğrudan "typeof (ITuple)" özelliğini kullanamazsınız, ancak bunu almak için 'Type.GetType (" System.ITuple, mscorlib ")' işlevini kullanabilirsiniz. – Dirk
@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