运行时向泛型方法传递类类型

5

我有一个名为IAuditable的接口,如下所示:

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

你知道我们可以在特定的库中运行时查找类, 请注意,我不想在运行时调用通用方法,只想使用找到的类调用通用方法,换句话说,如何将特定的类作为T传递给GetActualNewValue<...>()?

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

这段代码运行得非常完美,但主要问题是DTClient必须在运行时找到并定义为T,才能用于GetActualValue函数。

感谢各位。


只是为了我理解,您正在尝试在运行时迭代类型,将它们放入变量中,然后将该变量用作通用方法调用的类型参数? - Chris
2个回答

0

试试这个:

    AuditTrail auditTrail = new AuditTrail();

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

1
你的代码只是在运行时查找一个类,正如代码所示,我找到这个类没有问题。 - Aria
抱歉,我第一次没有理解你的问题。我已经更新了代码,请再试一次,希望能有所帮助。 - Abhishek Jain
不客气,我之前见过这个解决方案。现在我该如何从“result”中访问AuditSummary属性呢? - Aria
你的解决方案不起作用,因为在调用GetActualNewValue方法时必须将Type定义为T。无论如何,我不想在运行时调用泛型方法。谢谢。 - 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
            }
        }
    }             
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接