2013-08-12 10 views
5

Mam interfejs o nazwie IAuditable następująco:Podania klasa typu metody rodzajowe w czasie wykonywania

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

i dwie ogólne metody w klasie ścieżka audytu następująco:

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

jak mam jednego nieruchomość na powrót Podsumowanie Audytu uzyskując klasę w czasie wykonywania następująco:

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 ""; 
     } 
    } 

Jak wiesz, możemy znaleźć klasę w czasie wykonywania w konkretnej bibliotece, Uwaga: nie chcę wywoływać ogólnej metody w czasie wykonywania, chcę tylko wywołać ogólną metodę z założonym, innymi słowy, jak mogę przekazać konkretną bibliotekę klasa GetActualNewValue < ...>() jako T,

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

Ta praca kod idealnie, ale głównym problemem jest DTClient musi znaleźć w czasie wykonywania i zdefiniować jako T GetActualValue.

Dzięki wszystkim.

+0

Tak więc rozumiem, starasz się iterację typów w czasie wykonywania, należy umieścić je w zmiennej, a następnie użyć tej zmiennej jako parametr typu rodzajowego na wywołanie metody? – Chris

Odpowiedz

0

Spróbuj tego:

AuditTrail auditTrail = new AuditTrail(); 

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

Twój kod znajduje klasę w czasie wykonywania, Jak pokazuje kod, nie mam problemu ze znalezieniem klasy. – Aria

+0

Niestety, nie zrozumiałem twojego problemu za pierwszym razem., Zaktualizowałem kod, spróbuj jeszcze raz, mam nadzieję, że to pomoże –

+0

Nie ma za co, już widziałem to rozwiązanie, teraz jak mogę uzyskać dostęp do właściwości AuditSummary z "wyniku". – Aria

0

Można użyć metody statycznej przejściu starego obiektu i zmienionych parametrów obiektu w celu śledzenia zmian.

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 
      } 
     } 
    }    
}