在编译时循环遍历类中的所有对象

时间:2018-09-04 16:12:48

标签: c# string reflection properties

我需要在编译时合并类中的所有属性以构建字符串。我见过类似的问题,但是它们都在处理运行时场景。基本上,我有上千个属性,并且不希望再手动列出它们。我知道使用反射来使用typeof(X).getProperties(...),但是在运行时使用反射来执行此操作不会对性能造成任何影响。有没有办法让我遍历类中的所有属性以使所有属性组成一个字符串?

    Class1 : SomeInterface
    {
            int1;
            int2;
            ...
            int1000;
            string stringOfAllProperties;

            public getAllPropertiesAsString()
            {
               return stringOfAllProperties = int1+int2+int3...;
            }       
     }

3 个答案:

答案 0 :(得分:1)

我认为只有反思才能为您提供帮助。您可以做的是引入字典,其中键将是类型,值将是字符串连接结果。该词典将在您的应用程序中用作单例。因此,每个类型只计算一次字符串,从而几乎完全消除了性能损失。

答案 1 :(得分:1)

如果您希望每次编译时都执行此操作,而不是在运行时执行,那么我将使用反射构建一个在运行时永远不会调用的方法。然后,您可以拥有第二个控制台应用程序,其唯一目的是触发该方法并将字符串写入文本文件或其他内容。在(您的主项目的)项目属性中,您可以执行命令行操作(例如运行控制台应用程序)。

在不知道您使用什么框架的情况下,我无法告诉您控制台应用程序将如何与主应用程序进行交互。不过,您的主应用程序可能是控制台应用程序的依赖项,如果您的控制台应用程序是公共的,则它们可以直接在主应用程序中使用类。

enter image description here

答案 2 :(得分:1)

正如其他人所提到的,如果您有上千个属性,则可能会遇到设计问题。解决该设计问题是我的第一选择,但是如果那不是一个选择...

Visual Studio支持通过T4 templates生成编译时(或者精确地说是保存时间)代码,即,您可以执行以下操作:

<#@ template debug="false" hostspecific="false" language="C#" #>
<#@ output extension=".cs" #>

class MyClass
{
    <# var properties = new string [] {"int1", "int2", "int3", ...}; #>

    <# foreach (string property in properties) { #>
        private int <#= propertyName #>;
    <# } #>

    public string getAllPropertiesAsString()
    {
        return ""
        <# foreach (string property in properties) { #>
            + <#= propertyName #>;
        <# } #>
    }       
}

请注意,您必须在Visual Studio 2017安装过程中安装“ Visual Studio扩展开发”工作负载。