2013-08-12 3 views
5

У меня есть интерфейс, называемый IAuditable следующим образом:Passing типа класса для универсального метода во время выполнения

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

и два шаблонных метода в классе AuditTrail следующим образом:

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

, а также у меня есть один недвижимость для возвращения Резюме аудита, получив класс во время выполнения следующим образом:

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

Как вы знаете, мы можем найти класс во время выполнения в конкретной библиотеке, Обратите внимание: я не хочу вызывать общий метод во время выполнения, просто хочу вызвать общий метод с основанием, другими словами, как я могу передать конкретный класс GetActualNewValue < ...>(), как T,

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

Этот код работать отлично, но основная проблема заключается в DTClient должны найти во время выполнения и определить, как T для GetActualValue.

Спасибо всем.

+0

Именно поэтому я понимаю, что вы пытаетесь перебирать типы во время выполнения, помещать их в переменную, а затем использовать эту переменную в качестве параметра типа при вызове общего метода? – Chris

ответ

0

Попробуйте это:

AuditTrail auditTrail = new AuditTrail(); 

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

Ваш код просто найдет класс во время выполнения. Как показывает код, у меня нет проблем с поиском класса. – Aria

+0

Извините, я не понял вашу проблему в первый раз., Я обновил код, повторите попытку, надеюсь, это поможет –

+0

. Добро пожаловать, я видел это решение раньше, Теперь, как я могу получить доступ к свойству AuditSummary от «результата». – Aria

0

Вы можете использовать статический метод прохождения старого объекта и измененный объект в параметрах для отслеживания изменений.

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 
      } 
     } 
    }    
} 
Смежные вопросы