有没有一种方法可以将通用参数类型约束为某个属性的类型?

时间:2020-08-25 06:56:07

标签: c# generics interface solid-principles

请考虑以下代码:

public class User 
{
  public String Id {get; set;}
}

public interface IUserService 
{
  bool IsAdmin(string userId);
}

我不希望在接口中指定userId参数的类型,而是要使用一种通用类型,该类型必须与类{{ 1}},这样,如果我最终决定更改属性的类型,则不必更改代码。 所以我的想法是这样的:

Id

有可能吗?

3 个答案:

答案 0 :(得分:1)

不,那不可能。将泛型限制为一种特定类型也不太有用,这违背了拥有泛型的目的。

您可以做的是创建自己的类型UserId(类或结构),并在两个地方都使用它。因此,如果您的程序中用户标识符的结构发生了变化,则可以将其更改为一个位置,并且可以在整个程序中使用。

答案 1 :(得分:0)

也许您可以使用动态属性?:

public dynamic Id { get; set; }

答案 2 :(得分:0)

当前,这是不可能的,但作为解决方法,您可以使用using alias directive,前提是两个接口都在同一文件中。

在两个接口都位于的文件中,添加一个使用别名的指令,如下所示:

using UserIdType = System.String;

现在,您可以在UserIdTypeString中使用User代替IUserService。如果要更改Id属性的类型,只需更改using别名指令,而不必更改Id或参数userId的类型。 / p>


但是,您是否还不必更改依赖于Id属性的代码?与您必须进行的所有其他代码更改相比,更改一件事并没有什么大麻烦。