首页 > 解决方案 > 将 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 类中。或任何其他使用静态值来实现相同结果的解决方案。将不胜感激任何帮助?

标签: c#asp.net-core

解决方案


在构建列表并将其存储在静态变量中的类中创建一个静态项怎么样?这意味着无论您的 setter 被调用多少次,您都可以构建一次列表。您仍然需要搜索列表,但不需要使用反射。


推荐阅读