【问题标题】:Passing class type to generic method at runtime在运行时将类类型传递给泛型方法
【发布时间】:2013-08-13 08:51:42
【问题描述】:

我有一个名为 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 "";
        }
    }

如您所知,我们可以在运行时在特定库中找到类, 请注意,我不想在运行时调用泛型方法,只想调用带有创建的泛型方法,换句话说,我如何将特定类传递给 GetActualNewValue<...>() 作为 T,

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

此代码运行良好,但主要问题是 DTClient 必须在运行时找到并将 GetActualValue 定义为 T。

谢谢大家。

【问题讨论】:

  • 我明白了,您试图在运行时迭代类型,将它们放入一个变量中,然后将该变量用作泛型方法调用的类型参数?

标签: c# generics reflection runtime


【解决方案1】:

您可以使用静态方法在参数中传递旧对象和更改对象来跟踪更改。

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

【讨论】:

    【解决方案2】:

    试试这个:

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

    【讨论】:

    • 您的代码只是在运行时找到一个类,正如代码所示,我找到该类没有问题。
    • 对不起,我第一次没有理解你的问题。我已经更新了代码,请再试一次希望它会有所帮助
    • 不客气,我以前见过这个解决方案,现在我如何从“结果”访问 AuditSummary 属性。
    • 您的解决方案不起作用,因为我必须在调用 GetActualNewValue 方法时将 Type 定义为 T,无论如何我不想在运行时调用泛型方法。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-15
    • 2017-12-23
    相关资源
    最近更新 更多