2010-11-22 20 views
29

Üzgünüm, belgelere System.Type türünü ve PropertyInfo tipini arıyorum, ancak ihtiyacım olan şeyi bulamıyorum.Bir mülkün sanal olarak bildirilmiş olup olmadığını öğrenin

Bir özellik (veya yöntem veya başka bir üye) bildirim sınıfında virtual bildirildiğini nasıl anlarım?

Örneğin; Age mülkiyet virtual ya da değil ilan edildi ise

class Cat 
{ 
    public string Name { get; set; } 
    public virtual int Age { get; set; } 
} 

nasıl anlatır? - Onların erişimcileri olan

var isVirtual = typeof(Cat).GetProperty("Age").GetGetMethod().IsVirtual; 

cevap

49

Sen IsVirtual özelliğini kullanabilirsiniz. Bu deneyin: Eğer isteseydim

typeof(Cat).GetProperty("Age").GetAccessors()[0].IsVirtual 

, sen gibi bir uzantı yöntemini kullanabileceği bir özellik sanal olup olmadığını belirlemek için aşağıdaki:

public static bool? IsVirtual(this PropertyInfo self) 
{ 
    if (self == null) 
     throw new ArgumentNullException("self"); 

    bool? found = null; 

    foreach (MethodInfo method in self.GetAccessors()) { 
     if (found.HasValue) { 
      if (found.Value != method.IsVirtual) 
       return null; 
     } else { 
      found = method.IsVirtual; 
     } 
    } 

    return found; 
} 

o null döner ya tesiste erişimcilere varsa (asla olmamalıdır) veya tüm özellik erişimcileri aynı sanal duruma sahip değildir - en azından bir tanesi sanal değildir.

+1

Göz önüne alınan özellik salt yazılırsa bu başarısız olur. – cdhowie

+0

Cevabınız için çok teşekkürler. –

+1

@cdhowie, evet başarısız olur. Örneğimde hata kontrolünü dahil etmedim. –

17

Teknik olarak, özellikleri olmayan sanal şunlardır:

+1

+1 'GetAccessors()' açıkçası daha iyi. –

+0

Sorunu çözmek için ** LINQ ** kullandım: "var isVirtual = prop.GetType(). GetProperties() .Where (x => x.GetAccessors(). Any (a => a.IsVirtual)); ' –

+0

@MichaelCeranski Bu, erişimciler çakışan sanal öznitelikleri olduğunda kodumla aynı şeyi yapmadığına dikkat edin. – cdhowie

İlgili konular