gpt4 book ai didi

c# - 以编程方式检索多个类的静态成员

转载 作者:行者123 更新时间:2023-11-30 14:38:47 25 4
gpt4 key购买 nike

我不确定解决这个问题的最佳方法,是通过反射(reflection)、完全重新设计我的类,还是做一些简单的事情。

基本上我有一个基类,我可以有任意数量的从它继承的子类。让我们调用基类 Shape 和子类 CircleShape、RectangleShape 等。

基类本身从不实例化,只有子类。有些从未实例化,有些在程序的整个生命周期中实例化多次。

有时我需要特定于子类的信息在实例化它之前。现在我使用枚举来区分所有子类类型。然后我根据 switch 语句中的枚举实例化每个子类,如下所示:

switch (shapeType)
{
case CircleShape:
shape = new CircleShape();

case SquareShape:
shape = new RectangleShape();
}

但是我不想使用这种硬编码的 switch 语句,而是想枚举所有子类。有没有办法自动检索子类列表并访问它们的 STATIC 成员以获取有关它们的信息(在实例化它们之前)?或者是否更容易手动实例化每个类一次并将它们添加到数组中以便我枚举它们(但不将这些实例与任何实际数据联系起来)。

或者我应该做一些完全不同的事情吗?

最佳答案

您可以使用属性 来定义您的类的元数据,然后使用反射在运行时读取此元数据来决定您要对此类执行的操作,而无需实例化它。

这里有一些关于使用属性的信息(您也可以创建自己的自定义属性)using attributes in C#

这是一个简单的示例:

类定义:

   // ********* assign the attributes to the class ********

[BugFixAttribute(121,"Jesse Liberty","01/03/05")]
[BugFixAttribute(107,"Jesse Liberty","01/04/05", Comment="Fixed off by one errors")]
public class MyMath
{
...

使用反射读取属性:

// get the member information and use it to retrieve the custom attributes
System.Reflection.MemberInfo inf = typeof(MyMath);
object[] attributes;
attributes = inf.GetCustomAttributes(typeof(BugFixAttribute), false);

// iterate through the attributes, retrieving the properties
foreach(Object attribute in attributes)
{
BugFixAttribute bfa = (BugFixAttribute) attribute;
Console.WriteLine("\nBugID: {0}", bfa.BugID);
Console.WriteLine("Programmer: {0}", bfa.Programmer);
Console.WriteLine("Date: {0}", bfa.Date);
Console.WriteLine("Comment: {0}", bfa.Comment);
}

注意:尽管如此,在大量对象的大量迭代中过度使用反射时要小心,因为它会带来显着的性能成本。

关于c# - 以编程方式检索多个类的静态成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7366752/

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