从子类实例调用泛型参数的扩展方法
本文关键字:扩展 方法 参数 泛型 子类 实例 调用 | 更新日期: 2023-09-27 18:04:16
我的问题是:
public class User
{
public virtual void Save()
{
Connection.Save(this);
}
}
public class Administrator : User
{
}
public static class Queries
{
public static void Save<T>(this IDbConnection cn, T entity)
{
var properties = Mapper<T>.GetProperties();
// other code
}
}
public static class Mapper<T>
{
public static IList<Property> GetProperties()
{
var type = typeof(T);
// other code
}
// other T-dependent methods
}
当user.Save()
被调用时,它工作得很好,但是对于admin.Save()
,通用参数T
是User
,而不是Administrator
,因此GetProperties()
内部的反射返回用户属性。
我可以通过重载Mapper<T>.GetProperties(instance.GetType())
使其工作,但这似乎在语义上不正确,因为有两种类型会导致歧义。
有更好的方法来解决这个问题吗?谢谢。
泛型类型参数在编译时解析,而不是在运行时,对此无能为力。
您需要通过在对象的实例上使用GetType()
来确定类型,以获得运行时类型,因此您可能必须考虑到这一点,重新考虑您的设计。也许在这种情况下使用泛型并不是最好的方法。