从子类实例调用泛型参数的扩展方法

本文关键字:扩展 方法 参数 泛型 子类 实例 调用 | 更新日期: 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(),通用参数TUser,而不是Administrator,因此GetProperties()内部的反射返回用户属性。

我可以通过重载Mapper<T>.GetProperties(instance.GetType())使其工作,但这似乎在语义上不正确,因为有两种类型会导致歧义。

有更好的方法来解决这个问题吗?谢谢。

从子类实例调用泛型参数的扩展方法

泛型类型参数在编译时解析,而不是在运行时,对此无能为力。
您需要通过在对象的实例上使用GetType()来确定类型,以获得运行时类型,因此您可能必须考虑到这一点,重新考虑您的设计。也许在这种情况下使用泛型并不是最好的方法。