c# - 将 setter 限制为静态值列表
问题描述
我有以下型号
public class CustomEvent
{
private string _tag;
public int Id { get; set; }
public int PId { get; set; }
public DateTimeOffset TimeStamp { get; set; }
public string Mentor { get; set; }
public string Type { get; set; }
public string Tag
{
get => _tag;
set
{
_tag = GetTagTypeList.GetTagType(typeof(TagType)).Contains(value) ? value : "Unspecified";
}
}
}
public static class TagType
{
public const string Unspecified = "Unspecified";
public const string AmxPersonalItemCreate = "Amx.PersonalItem.Create";
public const string AmxPersonalItemUpdate = "Amx.PersonalItem.Update";
public const string AmxPersonalItemDelete = "Amx.PersonalItem.Delete";
public const string AmxRegionCreate = "Amx.Region.Create";
public const string AmxRegionUpdate = "Amx.Region.Delete";
public const string AmxRegionDelete = "Amx.Region.Update";
}
public class GetTagTypeList
{
public static List<String> GetTagType(Type type)
{
return type.GetFields(BindingFlags.Public | BindingFlags.Static | BindingFlags.FlattenHierarchy)
.Select(x=>x.GetValue(null).ToString()).ToList();
}
}
上面的代码将设置器限制为静态值列表。然而,这是非常低效的,因为每次调用方法 [GetTagType] 时它都会反映类。
我现在需要使用私有构造函数和静态值创建一个 TagType 类。
给定要表达的值有“。” 在它们中,它还需要一个自定义的 json 序列化程序。
我在某处读到一个解决方案可能是使用嵌套类来获取与正在创建的字符串匹配的值。
即对于“Amx.PersonalItem.Create”,我们可以创建一个类似于:
public static class Amx
{
public static class PersonalItem
{
public static TagType Create { get; } = new TagType("Amx.PersonalItem.Create");
}
}
我需要将上面的示例集成到我的 CustomEvent 类中。或任何其他使用静态值来实现相同结果的解决方案。将不胜感激任何帮助?
解决方案
在构建列表并将其存储在静态变量中的类中创建一个静态项怎么样?这意味着无论您的 setter 被调用多少次,您都可以构建一次列表。您仍然需要搜索列表,但不需要使用反射。
推荐阅读
- bash - 如何将 $(command) 回显到 bash 配置文件中
- algorithm - Leetcode 动态规划的目标和
- java - 如何使用 Mybatis 和 SQLite 创建表?
- php - 遍历具有特定条件的php多维数组
- azure-functions - 在 Azure 上更新 Functions 版本
- sql - Bigquery - 忽略 NULL 值的列之间的平均值
- node.js - 为什么我的 git bash root 命令不起作用?
- ruby-on-rails - 在 aws 实例上运行 rake 任务
- html - 图片无法在移动设备上缩放
- python - 时间戳的 Asyncpg INSERT 查询在“18”处或附近返回 ERROR 语法错误