c# - 实现基本接口(interface)问题

标签 c# generics interface

我在基础库项目中定义了以下接口(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>();
    }
}

然而,这给出了错误:

The type 'T' cannot be used as type parameter 'T' in the generic type or method '...GetUser(int)'. There is no boxing conversion or type parameter conversion from 'T' to 'User'.

我确定我做错了一些基本的事情。我很感激任何关于这个模型的建议可以改进。谢谢

编辑(这里是 GetUser 方法的请求):

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

注意:_session 是一个 NHibernate session 。

最佳答案

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

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

你的 GetUser()方法只接受继承自 User 的类型.

您需要更改 GetUser()接受实现 IUser 的通用类型的原型(prototype),或 User<T>原型(prototype)只接受继承自 User 的泛型类型.

要么这样:

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

或者这个:

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

编辑: 您应该选择第一种方法还是第二种方法取决于您想要做什么。

1) 你想要你的 IWorkContextIUser 一起工作界面,你接受 GetUser()方法返回 IUser => 选择选项 1

2) 你想要 GetUser()方法采用继承自 User 的类型,并且您接受 IWorkContext界面适用于 User而不是 IUser => 选择选项 2,并修改 IWorkContext界面。

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

关于c# - 实现基本接口(interface)问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12373517/

相关文章:

c# - 为什么 Microsoft 不使用 C# 开发类似 Halo 的次世代游戏?

c# - 'out' 参数与通用/模板参数 : best practice

c# - Func<out TResult> 如何返回 Func<out TResult>?

go - 如何使用接口(interface)来规范化不同的结构?

java - 如何在此接口(interface)中覆盖此方法(参见代码)?

c# - Azure Functions 的 HostingEnviornment.QueueBackgroundWorkItem 等效项

c# - C#程序集的代码签名证书

c# - 这个 Composition 是否违反了面向对象编程的任何原则?

java - CDI : inject two generics from the same template

c# - 如何设置显式实现的接口(interface)的属性?