在运行时将类类型传递给泛型方法
本文关键字:泛型方法 类型 运行时 | 更新日期: 2023-09-27 18:27:21
我有一个名为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);
}
以及我有一个属性,通过在运行时获取一个类来返回Audit Summary,如下所示:
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 "";
}
}
正如您所知,我们可以在运行时在特定的库中找到类,请注意,我不想在运行时调用泛型方法,只想用founded调用泛型方法。换句话说,我如何将特定的类传递给GetActualNewValue<…>()作为T,
AuditTrail auditTrail = AuditTrail.GetAuditTrail(76);
string summmary = auditTrail.GetActualOldValue<DTClient>().AuditSummary;
string details = auditTrail.GetActualOldValue<DTClient>().AuditDetails;
这段代码运行得很好,但主要问题是DTClient必须在运行时找到并定义为GetActualValue的T。
谢谢大家。
试试这个:
AuditTrail auditTrail = new AuditTrail();
var method = auditTrail.GetType().GetMethod("GetActualOldValue");
var genericMethod = method.MakeGenericMethod(auditTrail.GetType());
var result = genericMethod.Invoke(auditTrail, null);
您可以使用静态方法在参数中传递旧对象和已更改对象来跟踪更改。
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
}
}
}
}