定义每个子类定义一次的静态属性的最佳方法是什么?

2023-11-27

我编写了以下控制台应用程序来测试静态属性:

using System;

namespace StaticPropertyTest
{
    public abstract class BaseClass
    {
        public static int MyProperty { get; set; }
    }

    public class DerivedAlpha : BaseClass
    {
    }

    public class DerivedBeta : BaseClass
    {
    }

    class Program
    {
        static void Main(string[] args)
        {
            DerivedBeta.MyProperty = 7;
            Console.WriteLine(DerivedAlpha.MyProperty); // outputs 7
        }
    }
}

正如此控制台应用程序所示,MyProperty属性对于 BaseClass 的所有实例都存在一次。是否有一种模式可以让我定义一个静态属性,该属性将为每个子类类型分配存储空间?

鉴于上面的例子,我想要的所有实例DerivedAlpha共享相同的静态属性,并且所有实例DerivedBeta分享another静态属性的实例。

我为什么要尝试这样做?

我正在惰性地初始化具有某些属性的类属性名称的集合(通过反射)。每个派生类实例的属性名称都是相同的,因此将其存储在每个类实例中似乎很浪费。我无法在基类中将其设为静态,因为不同的子类将具有不同的属性。

我不想在每个派生类中复制填充集合(通过反射)的代码。我知道一种可能的解决方案是在基类中定义填充集合的方法,并从每个派生类中调用它,但这不是最优雅的解决方案。

更新 - 我正在做的事情的例子

应乔恩的要求,这是我正在尝试做的一个示例。基本上,我可以选择用以下方式装饰我的类中的属性[SalesRelationship(SalesRelationshipRule.DoNotInclude)]属性(还有其他属性,这只是一个简化的例子)。

public class BaseEntity
{
    // I want this property to be static but exist once per derived class.
    public List<string> PropertiesWithDoNotInclude { get; set; }

    public BaseEntity()
    {
        // Code here will populate PropertiesWithDoNotInclude with
        // all properties in class marked with
        // SalesRelationshipRule.DoNotInclude.
        //
        // I want this code to populate this property to run once per
        // derived class type, and be stored statically but per class type.
    }
}

public class FooEntity : BaseEntity
{
   [SalesRelationship(SalesRelationshipRule.DoNotInclude)]
   public int? Property_A { get; set; }

   public int? Property_B { get; set; }

   [SalesRelationship(SalesRelationshipRule.DoNotInclude)]
   public int? Property_C { get; set; }
}

public class BarEntity : BaseEntity
{
   public int? Property_D { get; set; }

   [SalesRelationship(SalesRelationshipRule.DoNotInclude)]
   public int? Property_E { get; set; }

   public int? Property_F { get; set; }
}

期望的最终结果

访问FooEntity.PropertiesWithDoNotInclude返回一个List<string> of:

{
  "Property_A",
  "Property_C"
}

访问BarEntity.PropertiesWithDoNotInclude返回一个List<string> of:

{
  "Property_E"
}

两种可能的方法:

  • 使用属性;用属性装饰每个子类,例如

    [MyProperty(5)]
    public class DerivedAlpha
    {
    }
    
    [MyProperty(10)]
    public class DerivedBeta
    {
    }
    

    当然,只有当它们实际上是常量时,这才有效。

  • 使用字典:

    var properties = new Dictionary<Type, int>
    {
        { typeof(DerivedAlpha), 5) },
        { typeof(DerivedBeta), 10) },
    };
    

编辑:现在我们有了更多上下文,Ben 的答案非常好,使用了 C# 中泛型的工作方式。它就像字典的例子,但是内置了惰性、线程安全和简单的全局访问。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

定义每个子类定义一次的静态属性的最佳方法是什么? 的相关文章

随机推荐

  • 调用 getDrawingCache() 时视图太大,无法放入绘图缓存

    我正在尝试截取 LinearLayout 内容的屏幕截图 该布局包含一个可以具有可变高度 宽度的滚动视图 当布局不太大时 此代码可以正常工作 即您不需要在屏幕上滚动太多来查看所有内容 View v1 LinearLayout theLayo
  • FireMonkey 应用程序中是否有可使用的 Web 浏览器组件?

    对于 Delphi VCL 有TWebBrowser和一些第三方组件 例如TEmbeddedWebBrowser可用于浏览网页 有没有类似的网络浏览器组件 但对于火猴框架在德尔福XE2 最好有 Windows 和 Mac 支持 您可以使用C
  • Angular2订阅理解箭头功能

    我尝试通过以下示例来理解打字稿的箭头函数角2可观察的订阅方法 有人能给我解释一下吗 我有这个有效的代码 this readdataservice getPost subscribe posts gt this posts posts 但如果
  • C#中如何实现多行字符串; VB 的 XML Literals 的替代品?

    我在 vb net 中有一个项目使用XML Literals像这样处理大块 SQL Dim SQL As String a Use test alter table BarFoo alter column CouponName nvarch
  • 如何绑定perl脚本中的每个变量?

    我想看到 perl 脚本中的变量被创建 访问 销毁时的每个地方 使用它可以轻松到达tie or Variable Magic 但是如何在创建变量时自动应用这个魔法呢 您可以查看 B Xref 它会生成应用程序中所有变量的交叉引用列表 基本上
  • 导航视图项目按下时不会响应

    我正在开发一个带有侧导航抽屉的应用程序 抽屉打开得很好 但是据说可以 点击 的文本似乎没有响应 动画显示 当轻敲抽屉时会有反馈 您可以听到声音 但没有任何结果 我尝试放置 toast 消息以查看按钮是否注册了操作 但按下时没有出现 toas
  • JPanel 动作监听器

    我有一个 JPanel 其中有一堆不同的复选框和文本字段 我有一个已禁用的按钮 需要在设置特定配置时启用 我需要的是在整个 JPanel 上寻找事件的监听器 每当发生任何变化时 我相信我需要一个动作侦听器 但我找不到任何东西来桥接动作侦听器
  • “导入错误:没有名为 pwd 的模块”,但它存在

    我正在尝试在本地测试 gae boilerplate 但是当我尝试创建新帐户时 会出现以下错误 奇怪的是 如果我打开 python 解释器并输入 import pwd 它就会起作用 Internal Server Error The ser
  • Objective C 中的悬空指针 - nil 也会释放内存吗?

    我的理解是 当内存未被释放或 释放 时 就会发生内存泄漏 当指针未设置为 nil 并且对象被释放时 就会出现悬空指针 我的问题是 可以将对象设置为 nil 释放内存并清除指针引用吗 i e Car myCar Car alloc initW
  • 需要重构箭头反模式的想法

    我继承了一个怪物 它伪装成 NET 1 1 应用程序处理符合医疗保健索赔支付 ANSI 835 标准的文本文件 但它是一个怪物 正在处理的信息涉及医疗保健索赔 EOB 和报销 这些文件由在前几个位置具有标识符的记录和根据该类型记录的规范格式
  • Go结构体和字节数组之间的转换

    我正在用 Go 编写一个客户端 服务器应用程序 我想在 Go 中执行类似 C 的类型转换 例如 在围棋中 type packet struct opcode uint16 data 1024 byte var pkt1 packet n r
  • 如何在视图内切换视图?

    我正在使用 MVVM 轻型框架制作一个 WPF 应用程序 我想做的是在视图中有一个登录表单 当用户按下该视图中的按钮时 它会为附加的 ViewModel 启动 LoginCommand 从那里我要么想要启动一个包含应用程序其余部分的新窗口
  • 没有可用的 mysql-server 软件包

    我正在尝试在 Amazon Linux 实例上设置 MySQL 我已经尝试了所有方法 也使用 y 选项 sudo yum install mysql server sudo yum install mysql56 server sudo y
  • 从类中删除必需的属性,但 MVC3 仍然不会在文本框中没有值的情况下发布表单

    我有课 在某一时刻 我使用 System ComponentModel 将类的属性设置为 Required 好吧 然后我意识到这是没有必要的 我已经删除了所需的属性 但是当我尝试将表单提交到 ActionResult 时 表单不会发布 并且
  • C# - 通过进程名称的一部分来终止进程

    我正在寻找如何在 C 中执行此操作 如下所示 foreach Process proc in Process GetProcessesByName cheatengine x86 64 proc Kill 我正在使用这个语句 但是该程序有不
  • 销毁并重新创建一个对象是否会使指向该对象的所有指针无效?

    这是后续这个问题 假设我有这样的代码 class Class public virtual method this gt Class new this Class Class object new Class object gt metho
  • 检测 Android JNI 代码中的本机内存泄漏

    如何检测Android JNI代码中的内存泄漏 我正在使用弗罗约 2017年更新 valgrind 可用对于安卓 内置的 malloc 调试功能在以下版本中得到了显着扩展 安卓N 对于查找内存泄漏非常有用 您可能需要 exit 应用程序触发
  • iPhone 的动态图标更改

    我的问题也和其他人之前问过的一样 我发现一旦你设置了应用程序的图标 我们就无法更改应用程序图标动态地 是的 我同意了 如果是这样 我们使用动态图标苹果不接受 但我承认苹果有一些规则和规定 所以这是我的问题 如何动态更改应用程序图标 我不会将
  • AppleScript:获取对象或类的所有属性的列表

    为了存储对象的值以供外部 外部 AS 访问 我需要能够获取该对象的每个属性 然后我尝试将其强制为文本并将其存储在某个地方 如何获取对象拥有的属性列表 作为一个例子 我可以这样写 tell me get properties end tell
  • 定义每个子类定义一次的静态属性的最佳方法是什么?

    我编写了以下控制台应用程序来测试静态属性 using System namespace StaticPropertyTest public abstract class BaseClass public static int MyPrope