【问题标题】:Error using the generic type BaseUser requires 1 argument使用泛型 BaseUser 时出错需要 1 个参数
【发布时间】:2018-08-27 07:58:31
【问题描述】:

我有一个界面

public interface  IIdentity<T>
{
    T GetUser();
}

我有一个将接口实现为抽象方法的基类

public abstract class BaseUser<T> : IIdentity<T>
{
    public string UserId { get; set; }
    public string AuthType { get; set; }
    public List<Claim> Claims { get; set; }
    public abstract T GetUser();
}

在继承基类的类中

 public class JwtUser : BaseUser
 {
     public string Sub { get; set; }
 }

我在使用泛型类型 BaseUser 时遇到错误需要 1 个参数,我在这里做什么,基本上我希望我的用户从它所做的基类继承共享属性(我认为)并实现泛型方法来自基类,因为我将拥有不同类型的用户(JWT/Windows 等),我需要抽象出 getUsers 方法,希望这有意义吗?

【问题讨论】:

  • 为什么接口和基类中需要&lt;T&gt;
  • 界面不知道是什么类型的用户?

标签: c# generics interface abstract-class


【解决方案1】:

您必须有多种方法来实现这一点,两者都需要在 BaseUser 中设置泛型。

你可以公开那个泛型:

public class JwtUser<T> : BaseUser<T>
{
    public string Sub { get; set; }
}

或者,只需设置泛型:

public class JwtUser : BaseUser<JwtUser>
{
    public string Sub { get; set; }
}

【讨论】:

    【解决方案2】:

    应该是这样的,参考:Generic Classes (C# Programming Guide)

    public class JwtUser<User> : BaseUser<User>
     {
         public string Sub { get; set; }
     }
    

    public class JwtUser<T> : BaseUser<T>
     {
         public string Sub { get; set; }
     }
    

    以及创建实例时

    var jwtUser =new JwtUser<User> ();
    

      class JwtUser: BaseUser<JwtUser> { }
    

    最后,您必须将T template 的值指定为其泛型。

    例如,如果您使用 List&lt;T&gt; 来使用它,则必须使用正确的类型进行初始化,例如 if interger list then List&lt;int&gt; intlist = new List&lt;int&gt;();

    【讨论】:

    • 我没有 JWTUser 需要从 baseUser 继承并创建完整用户的用户类
    • @saj - 但你必须为 T 传递值,
    • @saj - 它解决了你的问题,但我建议再次通过泛型以获得更清晰的画面......
    猜你喜欢
    • 2021-10-24
    • 1970-01-01
    • 2023-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多