2010-06-15 22 views
10

Ben böyle bir şey varsa:PropertyInfo SetValue ve boş değerlere

object value = null; 
Foo foo = new Foo(); 

PropertyInfo property = Foo.GetProperties().Single(p => p.Name == "IntProperty"); 
property.SetValue(foo, value, null); 

Sonra foo.IntProperty bile value = null olsa 0 ayarlı alır. O IntProperty = default(typeof(int)) gibi bir şey yapıyor görünür. Ben bir "null" tipi (Nullable<> veya referans) olmayan bir InvalidCastExceptionIntProperty eğer atmak istiyorum. Reflection kullanıyorum, bu yüzden zamanın önünü bilmiyorum. Bunu yapmak için nasıl giderim? Eğer PropertyInfo varsa

cevap

12

, sen .PropertyType kontrol edebilirsiniz; .IsValueType doğrudur ve Nullable.GetUnderlyingType(property.PropertyType) boş ise, o zaman bir NULL olmayan bir değer tipi ise:

 if (value == null && property.PropertyType.IsValueType && 
      Nullable.GetUnderlyingType(property.PropertyType) == null) 
     { 
      throw new InvalidCastException(); 
     } 
+0

. Ben .PropertyType.IsClass karıştırmasını, ama çok uzak elde değildi. –

1

Belirtilen değer olup olmadığını belirlemek için PropertyInfo.PropertyType.IsAssignableFrom (value.GetType()) ifade kullanabilirsiniz mülke yazılabilir. Ayrıca

public bool CanAssignValueToProperty(PropertyInfo propertyInfo, object value) 
{ 
    if (value == null) 
     return Nullable.GetUnderlyingType(propertyInfo.PropertyType) != null || 
       !propertyInfo.IsValueType; 
    else 
     return propertyInfo.PropertyType.IsAssignableFrom(value.GetType()); 
} 

, kullanışlı Convert.ChangeType bulabilirsiniz: Ama değeri null olduğunda mülk atayabilirsiniz Dolayısıyla bu durumda mülkiyet türü null veya mülkiyet türü başvuru türü olduğu takdirde, davayı ele gerekir dönüştürülebilir değerler mülkiyete yazma yöntemi. bu kadar

+0

SetValue() zaten o davranışı istenen değere, ayarlayamıyor bir istisna atar (ama ArgumentException var). Sadece boş senaryoyu kullanmam gerek. –

İlgili konular