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

时间:2014-05-21 07:07:58

标签: c# generics

这是我的问题:

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()内的反射1}}返回用户属性。

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

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

1 个答案:

答案 0 :(得分:3)

通用类型参数在编译时解析,而不是在运行时解决,没有什么可以做的 您需要在对象实例上使用GetType()来确定类型以获取运行时类型,因此您可能需要重新考虑您的设计,并记住这一点。在这种情况下,使用泛型可能不是最好的事情。