2012-09-06 9 views
18

Wie kann ich bei einem Objekt feststellen, ob dieses Objekt über virtuelle Eigenschaften verfügt?Wie überprüft man, ob eine Eigenschaft virtuell mit Reflektion ist?

var entity = repository.GetByID(entityId); 

Ich habe versucht, in der Suche:

PropertyInfo[] properties = entity.GetType().GetProperties(); 

konnte aber nicht erkennen, wenn eine der Eigenschaften virtuelle anzeigen würde.

Antwort

32
PropertyInfo[] properties = entity.GetType().GetProperties() 
    .Where(p => p.GetMethod.IsVirtual).ToArray(); 

Oder für .NET 4 und unten:

PropertyInfo[] properties = entity.GetType().GetProperties() 
    .Where(p => p.GetGetMethod().IsVirtual).ToArray(); 

, die eine Liste der öffentlichen virtuellen bekommen Eigenschaften.

Es funktioniert nicht für schreibgeschützte Eigenschaften. Wenn es erforderlich ist, können Sie CanRead und CanWrite manuell überprüfen und die entsprechende Methode lesen.

Zum Beispiel:

PropertyInfo[] properties = entity.GetType().GetProperties() 
    .Where(p => (p.CanRead ? p.GetMethod : p.SetMethod).IsVirtual).ToArray(); 

Sie könnten auch einfach an die erste Accessor:

PropertyInfo[] properties = entity.GetType().GetProperties() 
    .Where(p => p.GetAccessors()[0].IsVirtual).ToArray(); 
+0

Um sicher privaten Eigenschaften handhaben Sie tun können: '(p.CanRead p.GetGetMethod (true): p.GetSetMethod (true)). IsVirtual;' –

8

versuchen mit

typeof(YourClass).GetProperty("YouProperty").GetGetMethod().IsVirtual; 
3

Dies ist ein wenig schwierig, weil eine Eigenschaft kann nur gelesen werden, schreibgeschützt oder Lese-/Schreib. Daher müssen Sie dafür, virtuell, wie diese beiden zugrunde liegenden Methoden überprüfen:

PropertyInfo pi = ... 
var isVirtual = (pi.CanRead && pi.GetMethod.IsVirtual) 
      || (pi.CanWrite && pi.SetMethod.IsVirtual); 
5

Verwenden Sie die GetAccessors Methode, zum Beispiel für die erste Eigenschaft:

Get-Accessor:

properties[0].GetAccessors()[0].IsVirtual 

Set Accessor:

properties[0].GetAccessors()[1].IsVirtual 
11

Überprüfung nur IsVirtual von Accessor Eigentum erhalten Sie auch Eigenschaften Schnittstelle, die nicht virtual in der Klasse deklariert sind. Wenn von "virtuellen Eigenschaften" Sie Eigenschaften bedeuten, dass Sie in abgeleiteten Klasse überschreiben können, sollten Sie auch prüfen, IsFinal (versiegelt):

var accessor = typeof(MyType).GetProperty("MyProp").GetAccessors()[0]; 
var isVirtual = accessor.IsVirtual && ! accessor.IsFinal; 

prüfen diese Probe App:

using System; 

namespace VirtualPropertyReflection 
{ 
    interface I 
    { 
     int P1 { get; set; } 
     int P2 { get; set; } 
    } 

    class A : I 
    { 
     public int P1 { get; set; } 
     public virtual int P2 { get; set; } 

     static void Main() 
     { 
      var p1accessor = typeof(A).GetProperty("P1").GetAccessors()[0]; 
      Console.WriteLine(p1accessor.IsVirtual); // True 
      Console.WriteLine(p1accessor.IsFinal); // True 

      var p2accessor = typeof(A).GetProperty("P2").GetAccessors()[0]; 
      Console.WriteLine(p2accessor.IsVirtual); // True 
      Console.WriteLine(p2accessor.IsFinal); // False 
     } 
    } 
} 

this answer See.

+0

Vielen Dank für dieses, sprach viele andere Antworten zu 'IsVirtual 'aber der kombinierte 'isFinal'-Check hat es für mich getan. – webnoob

Verwandte Themen