【问题标题】:How to get all the properties of a specified type in a class without reflection如何在不反射的情况下获取类中指定类型的所有属性
【发布时间】:2023-03-02 21:20:02
【问题描述】:

我有一个具有大量属性的类。其中大多数是自定义类型。我想获取所有这些属性,其接口的类型相同。

Public class abc:IamLegend
{
    few properties
}

public class def:IamLegend
{
    few properties
}

public class on_which_iamworking
{
    public abc propabc{ get; set; }
    public def propdef{ get; set; }
    public someothertype propother{ get; set; }
}

我想要返回 propabc 和 propdef 的东西。

我知道如何使用反射来做到这一点,但我正在寻找另一种方法。

我正在开发 c# 4.0

谢谢

【问题讨论】:

  • 为什么不想使用反射?
  • “我想获取属性,但我不想使用专门设计的系统”。
  • 客户的借口是他不想让它变得沉重(慢)
  • 听起来您的客户消息灵通。
  • 将此归咎于客户是一种糟糕的形式。作为开发人员,您的工作是向客户解释这些事情。这就是他们付钱给你的原因;他们不是专业的软件开发专家。

标签: c# oop class reflection interface


【解决方案1】:

组件有另一种方法。对于实现IComponent 的类,它是TypeDescriptor。我相信这是 WPF 使用的。

【讨论】:

    【解决方案2】:

    反射的主要问题是它很慢。如果您不想仅仅因为反射很慢而使用反射,您可以在某些静态属性或类中缓存您的属性列表。我在类似的问题中广泛使用了这种技术,并且性能没有任何问题。

    如果您对反射有圣战,您可以创建一个特殊的工具来解析 C# 文件(或构建您的项目、加载输出程序集并使用反射,但仅在构建之前,而不是在运行时),找到所需的属性和将其作为静态类数组属性初始化程序写入自动生成的文件(也可能是 C# 代码文件)。并在项目的预构建事件中调用该实用程序。然后你会得到所有需要的属性完全没有反射=)(但我不会那样做)

    【讨论】:

      【解决方案3】:

      嗯,有两种方法:

      1/

       return new List<string> { "propabc", "propdev" };
      

      2/ 反射:P

      如果您需要多次检索属性列表并且担心性能影响,只需计算一次列表并将其存储在静态属性中(因为类的属性列表在运行时不会更改) .

      【讨论】:

        【解决方案4】:

        恐怕如果不使用反射,这在运行时是不可能的。这就是反射的设计目的。

        【讨论】:

          猜你喜欢
          • 2012-08-16
          • 1970-01-01
          • 2020-08-24
          • 1970-01-01
          • 1970-01-01
          • 2019-08-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多