Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/395.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 有没有一种方法可以在不指定类型参数的情况下访问嵌套在泛型类中的类?_C#_Generics - Fatal编程技术网

C# 有没有一种方法可以在不指定类型参数的情况下访问嵌套在泛型类中的类?

C# 有没有一种方法可以在不指定类型参数的情况下访问嵌套在泛型类中的类?,c#,generics,C#,Generics,给定以下一组类: public abstract class User<T> where T : Permission { public ICollection<T> Permissions { get; set; } public class Client : User<Permission.Client> { } public class Admin : User<Permission.Admin> { } } p

给定以下一组类:

public abstract class User<T> where T : Permission
{
    public ICollection<T> Permissions { get; set; }

    public class Client : User<Permission.Client> { }

    public class Admin : User<Permission.Admin> { }
}

public abstract class Permission
{
    public class Client : Permission { }

    public class Admin : Permission { }
}
至少存在生成错误,阻止向
客户端
用户添加
管理员
权限。但是,这种用法可能会产生误导,因为传递给
User
的类型参数似乎是多余的


问题:是否有一种方法可以创建
用户.客户端
的实例,而不必在
用户
上指定类型参数
T
(例如
用户.客户端


下面是一个完整的示例。

除了大家在评论中提到的关于嵌套类的内容外,如果希望用户权限同时包含客户端和管理员权限,则需要使用类型权限的集合

public ICollection<Permission> Permissions { get; set; } = new List<Permission>();
public ICollection权限{get;set;}=new List();
这将修复您的示例,但不会使您的代码更容易理解

更新: 您的代码不能像这样是有原因的吗:

public class Program
{
    public static void Main(string[] args)
    {
        var client = new ClientUser();
        client.Permissions.Add(new ClientPermission());
        //This should fail because a client user can't have admin permissions
        client.Permissions.Add(new AdminPermission()); // cannot convert from 'AdminPermission' to 'ClientPermission'
    }


    public abstract class User<T> where T : Permission
    {
        public ICollection<T> Permissions { get; set; } = new List<T>();
    }

    public class ClientUser : User<ClientPermission> { }

    public class AdminUser : User<AdminPermission> { }

    public abstract class Permission
    {
    }

    public class ClientPermission : Permission { }

    public class AdminPermission : Permission { }
}
公共类程序
{
公共静态void Main(字符串[]args)
{
var client=new ClientUser();
client.Permissions.Add(new ClientPermission());
//这应该会失败,因为客户端用户不能拥有管理员权限
client.Permissions.Add(new AdminPermission());//无法从“AdminPermission”转换为“ClientPermission”
}
公共抽象类用户,其中T:Permission
{
公共ICollection权限{get;set;}=new List();
}
公共类ClientUser:用户{}
公共类AdminUser:用户{}
公共抽象类权限
{
}
公共类ClientPermission:权限{}
公共类AdminPermission:权限{}
}

否。由于
权限
是通用的,
权限.客户端
权限.客户端
是不同的类型。如果您希望能够说
new Permission.Client()
,但它位于名为
Permission
的新类/命名空间中,请将客户端移出您的用户类,您可以使用
new Client()
创建一个实例?或者将客户端嵌套类设置为非泛型用户类?由于嵌套,它似乎是多余的@ChristophLütjen是正确的,只需将
客户机
类移到另一个类之外,它就不再具有误导性。遵循上面的注释,使用非泛型类和泛型类,然后期望使用W/o type参数是正确的。在这里,反射可能会有所帮助,但一般不推荐,因为设计不正确
public class Program
{
    public static void Main(string[] args)
    {
        var client = new ClientUser();
        client.Permissions.Add(new ClientPermission());
        //This should fail because a client user can't have admin permissions
        client.Permissions.Add(new AdminPermission()); // cannot convert from 'AdminPermission' to 'ClientPermission'
    }


    public abstract class User<T> where T : Permission
    {
        public ICollection<T> Permissions { get; set; } = new List<T>();
    }

    public class ClientUser : User<ClientPermission> { }

    public class AdminUser : User<AdminPermission> { }

    public abstract class Permission
    {
    }

    public class ClientPermission : Permission { }

    public class AdminPermission : Permission { }
}