Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/309.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中提供类型安全性;枚举键-属性“;TypeScript高级类型中的类关系_C#_Typescript_Types - Fatal编程技术网

C# 如何在C中提供类型安全性;枚举键-属性“;TypeScript高级类型中的类关系

C# 如何在C中提供类型安全性;枚举键-属性“;TypeScript高级类型中的类关系,c#,typescript,types,C#,Typescript,Types,我用C#和TypeScript写作,并注意到有时用C#无法完成某些事情。我想检查用户权限,在C语言中,它变差了——在Configuration属性中反射和重复Permission键,而在TypeScript中它很容易完成。有没有办法摆脱C版本的缺点 C# TypeScript type Permission = "download" | "upload"; interface IUser { groups: string[]; } interface IConfiguration {

我用C#和TypeScript写作,并注意到有时用C#无法完成某些事情。我想检查用户权限,在C语言中,它变差了——在
Configuration
属性中反射和重复
Permission
键,而在TypeScript中它很容易完成。有没有办法摆脱C版本的缺点

C#

TypeScript

type Permission = "download" | "upload";

interface IUser {
    groups: string[];
}

interface IConfiguration {
    permissionGroups: { [key in Permission]: string };
}

let config: IConfiguration = JSON.parse(`
    "permissionGroups": {
        "download": "Everyone",
        "upload": "RegisteredUsers"
    }
`);

function check(user: IUser, permission: Permission) {
    if (!user.groups.includes(config.permissionGroups[permission]))
        throw "Access denied";
}

function downloadFile(user: IUser, fileName: string) {
    check(user, "download");
    alert(fileName + " downloaded!");
}

我不会说这是C#的一个缺点,只是你必须以不同的方式对待语言。Typescript在很大程度上仍然是一种动态语言,而C#在很大程度上是一种静态语言(尽管行开始变得有点模糊……)

当我遇到这样的问题时,我总是问自己,对于代码的需求,最好的数据结构是什么

在您的情况下,您需要能够针对一组已知操作定义权限组。在C#中,可以通过键查询的最接近JSON对象的东西是字典。所以我会声明我的权限,比如:

IDictionary<Permission, string> PermissionGroups = new Dictionary<Permission, string>
{
  { Permission.download, "Everyone" },
  { Permission.upload, "RegisteredUsers" }
};
您的代码暗示这来自您的配置文件,在这种情况下,这只是在其他地方产生了一个新问题


我有意避免讨论基于角色的安全性的可能方法。

我不认为将json配置文件映射到带有枚举键的字典这样的问题必须单独处理。丑陋的解决方案解决了这个任务,而使用enum的代码(尽管它是正确的,C#way)则不行。我想说的是,您如何将权限存储在内存中,以及它们如何存储在磁盘上(例如,配置文件)是完全不同的关注点,这两个关注点不应该在同一代码中混淆。它们在磁盘上的存储方式不应决定内存数据的结构。嗯,在一般情况下,您可能是对的,但这是配置模板,其目的是提供两个关注点之间的连接
IDictionary<Permission, string> PermissionGroups = new Dictionary<Permission, string>
{
  { Permission.download, "Everyone" },
  { Permission.upload, "RegisteredUsers" }
};
public void Check(User user, Permission permission)
{
  if (!user.Groups.Contains(PermissionGroups[permission]))
    throw new Exception("Access denied");
}