gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 22:51:57 28 4
gpt4 key购买 nike

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

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 的所有实例共享静态属性的另一个实例。

我为什么要这样做?

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

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

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

应 Jon 的要求,这是我正在尝试做的一个例子。基本上,我可以选择使用 [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>的:

{
"Property_A",
"Property_C"
}

正在访问 BarEntity.PropertiesWithDoNotInclude返回 List<string>的:

{
"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# 中的工作方式。它就像字典示例,但内置了惰性、线程安全和简单的全局访问。

关于c# - 定义每个子类定义一次的静态属性的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17780469/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com