2011-10-03 15 views
9

değişken referans türünün değer türü olup olmadığını denetlemek için bir yolu var mı?Genel bir yöntem parametresinin bir değer türü olup olmadığını nasıl kontrol edebilirim?

düşünün:

private object GetSomething<T>(params T[] values) 
{ 
    foreach (var value in values) 
    { 
     bool is ValueType; // Check if 'value' is a value type or reference type 
    } 
} 
+3

Sorunuz belirsiz. Belirli bir değişkenin * bir değer türü içerip içermediğini veya * jenerik yapı tarafından sadece belirli bir değer tipini * mi içerdiğini bilmek ister misiniz? Bir değişken, yazım nesnesine sahip olabilir ve kutulu bir int içerebilir. İçeriğin bir değer türü vardır, ancak değişken sadece ints içeren sınırlandırılmamıştır. Hangisini önemsiyorsun, neden? –

cevap

15
bool isValueType = typeof(T).IsValueType; 

İş bitti ... önemli değil gibi Durumunuz bakacağız ve o bile çalışır boş bir dizi için.

+6

uyarı: Eğer patolojik bir uç durumunda sağlamak istiyorsa, Nesnesi' 'olmak t '' let ve değerler kutulu yapılar olalım. –

+0

Bu durumda, yöntem parametresinin türü bir sınıf türü olan System.Object olur ve T temelindeki nesne kutulu bir struct * olduğunda bile T türünde değişkenler referans semantiklere sahip olur. Örneğin, t 'T' 'Çeşidi değişkenlerdir y'' a lEnumerator '' kısıtlı genel ve 'x' ve bir 'varsayalım. Eğer 'T' bir yapı tipi ise, 'x = y' sayım durumunu kopyalayabilir; Eğer T 'bir referans tipi ise, * bu nesne kutulu bir yapı olsa bile, x ise 'y' durumunu paylaşır. – supercat

0

değerlerden herhangi null ise

var cond = false; 
if(value != null) 
    cond = value.GetType().IsValueType 
+3

Aslında, bu güvenli değildir, çünkü "değer", hem ref türü hem de değer türü için potansiyel olarak "null" olabilir (ikincisi "Nullable ") –

+0

Ateşle oynamak. 'Value' boş :-) görüyorum – xanatos

+1

olabilir, itibar puan için avcılık benim kodlayıcı beyinde devraldı. –