2013-08-12 16 views
5

Ich habe eine Schnittstelle namens IAuditable wie folgt:Passing Klassentyp generische Methode zur Laufzeit

public interface IAuditable 
{ 
    string AuditSummary 
    { 
     get; 
    } 
    string AuditDetails 
    { 
     get; 
    } 
} 

Und zwei generische Methode in Audit Trail-Klasse wie folgt:

public T GetActualOldValue<T>() where T : IAuditable 
    { 
     return FromXElement<T>(OldValue); 
    } 
    public T GetActualNewValue<T>() where T : IAuditable 
    { 
     return FromXElement<T>(NewValue); 
    } 

sowie i eine habe Eigenschaft Rückkehr Audit Zusammenfassung durch eine Klasse zur Laufzeit immer wie folgt:

public string AuditSummary 
    { 
     get 
     { 
      if (HasNewValue || HasOldValue) 
      { 
       string libraryVal = GetLibraryValue(); 
       Assembly assembly = Assembly.Load(libraryVal); 
       foreach (Type type in assembly.GetTypes()) 
       { 
        if (type.IsClass == true) 
        { 
         if (type.FullName.EndsWith("." + ClassName)) 
         { 
          /*Here i want to call GetActualNewValue<foundClass>().AuditSummary 
          * or GetActualOldValue<foundClass>().AuditSummary; 
          */ 
         } 
        } 
       } 
      } 
      return ""; 
     } 
    } 

Wie Sie wissen, können wir Klasse zur Laufzeit in bestimmten Bibliothek finden, Bitte beachten Sie, ich möchte nicht eine generische Methode zur Laufzeit aufrufen, nur generische Methode mit funded aufrufen, mit anderen Worten, wie kann ich eine bestimmte übergeben Klasse GetActualNewValue < ...>() als T,

AuditTrail auditTrail = AuditTrail.GetAuditTrail(76); 
string summmary = auditTrail.GetActualOldValue<DTClient>().AuditSummary; 
string details = auditTrail.GetActualOldValue<DTClient>().AuditDetails; 

Dieser Code funktioniert perfekt, aber das Hauptproblem ist DTClient zur Laufzeit und definieren, wie T für GetActualValue finden müssen.

Danke allen.

+0

Nur so verstehe ich, Sie versuchen, Typen zur Laufzeit zu durchlaufen, legen Sie sie in eine Variable, und verwenden Sie dann diese Variable als Typ-Parameter bei einem generischen Methodenaufruf? – Chris

Antwort

0

Versuchen Sie folgendes:

AuditTrail auditTrail = new AuditTrail(); 

    var method = auditTrail.GetType().GetMethod("GetActualOldValue"); 
    var genericMethod = method.MakeGenericMethod(auditTrail.GetType()); 
    var result = genericMethod.Invoke(auditTrail, null); 
+0

Ihr Code findet nur zur Laufzeit eine Klasse. Wie der Code zeigt, habe ich kein Problem damit, die Klasse zu finden. – Aria

+0

Entschuldigung, ich habe Ihr Problem nicht sofort verstanden. Ich habe den Code aktualisiert. Bitte versuchen Sie es erneut. Hoffentlich hilft es. –

+0

Gern geschehen, ich habe diese Lösung schon gesehen. Wie kann ich auf die AuditSummary-Eigenschaft zugreifen? von "Ergebnis". – Aria

0

Sie statische Methode vorbei an altes Objekt und geänderte Objekt in Parametern Änderungen verfolgen verwenden können.

public class 
{ 
    AuditClass.AuditingUserActivity(OldObject,ChangedObject); 
} 

class AuditClass 
{ 
    public static void AuditingUserActivity<T>(this T obj1,obj2) 
    { 
     PropertyInfo[] properties = typeof(T).GetProperties(); //Gets all properties exist in passed objects of both 

     foreach (PropertyInfo pi in properties) 
     { 
      object value1 = typeof(T).GetProperty(pi.Name).GetValue(obj1, null); // gets value for each entity 
      object value2 = typeof(T).GetProperty(pi.Name).GetValue(obj2, null); 

      if (value1 != null && value2 != null) 
      { 
       //You can compare and check whether changes made or not 
      } 
     } 
    }    
} 
Verwandte Themen