C# 如何在C中提供类型安全性;枚举键-属性“;TypeScript高级类型中的类关系
我用C#和TypeScript写作,并注意到有时用C#无法完成某些事情。我想检查用户权限,在C语言中,它变差了——在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 {
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");
}