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

问题描述 投票:1回答:3

我需要在编译时将我的类中的所有属性连接起来构建一个字符串。我见过类似的问题,但他们都在处理运行时场景。基本上,我有一千个属性,宁愿不再手工列出它们。我知道使用反射来使用typeof(X).getProperties(...),但是在运行时使用反射我不会有任何性能损失。有没有办法让我遍历我的类中的所有属性来创建我所有属性的字符串?

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

            public getAllPropertiesAsString()
            {
               return stringOfAllProperties = int1+int2+int3...;
            }       
     }
c# string reflection properties
3个回答
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扩展开发”工作负载。


1
投票

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


1
投票

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

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

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.