实现基本接口问题

时间:2012-09-11 15:49:05

标签: c# generics interface

我在基础库项目中定义了以下接口:

public interface IWorkContext {
    T User<T>() where T : IUser;

    // Note this method is kind of a shortcut so i don't
    // have to keep passing in T
    IUser User();
}

public interface IUser {
    int Id { get; }
    string UserName { get; }
}

现在我有另一个项目使用以下类引用上面的类(实现IUser)。

public class User : IUser {
   public virtual int Id { get; set; }
   public virtual string UserName { get; set; }
   // ... Code removed for brevity
}

现在我还需要实现IWorkContext。这是我的第一次尝试:

public class DefaultWorkContext : IWorkContext {
    private readonly IUsersService _usersService;

    public DefaultWorkContext(IUsersService usersService) {
        _usersService = usersService;
    }

    public T User<T>() where T : IUser {
        return _usersService.GetUser<T>(1));
    }

    public User User() {
        return User<User>();
    }
}

但是这会产生错误:

  

类型'T'不能用作泛型类型中的类型参数'T'   或方法'... GetUser(int)'。没有拳击转换或类型   参数从“T”转换为“用户”。

我确信有一些根本我做错了。我很感激任何关于这个模型的建议都可以改进。感谢

编辑(根据请求,这是GetUser方法):

public T GetUser<T>(int id) where T : User {
    return _session.Get<T>(id);
}

注意:_session是一个NHibernate会话。

1 个答案:

答案 0 :(得分:2)

这里的问题是您将一个泛型类型作为类型参数传递给GetUser()方法,可能不满足您的{接受的泛型类型的继承条件{1}}方法。

编译器确保作为参数传递的类型始终满足类型条件。 实际上,您可以编写GetUser()来实现class NotUser而不是IUser。 然后使用User作为类型参数调用User<T>()方法 ,这将导致调用NotUser,其类型参数不会继承来自GetUser()

您的User方法只接受继承自GetUser()

的类型

您需要更改User原型以接受实现GetUser()的泛型类型,或IUser原型仅接受继承自User<T>的泛型类型。< / p>

要么:

User

或者这个:

public T GetUser<T>(int id) where T : IUser {
    return _session.Get<T>(id);
}

修改 的 是否应该选择第一种或第二种方法取决于您想要做什么。

1)您希望public T User<T>() where T : User { return _usersService.GetUser<T>(1)); } 使用IWorkContext界面,并且您接受IUser方法返回GetUser() =&gt;选择选项1

2)您希望IUser方法采用继承自GetUser()的类型,并且您接受User接口与IWorkContext而不是{{1}一起使用}} =&gt;选择选项2,然后修改User界面。

对我来说,选项1)更好,因为您不需要修改界面,也不会破坏通用性。但这取决于你想要做什么。