C# 打印C类中的所有变量#

C# 打印C类中的所有变量#,c#,class,variables,C#,Class,Variables,首先,我宁愿不使用反射来完成这一点 我有一节课,让我们说吧 public class exampleClass { public string var1 = "one"; public string var2 = "two"; public int var3 = 3; public string var4 = "four"; etc. etc.. } 我希望能够动态地遍历该类并打印出变量。我考虑过序列化,但不确定如何在这种情况下实现它(我能找到的唯一示例是XML,我不希望这

首先,我宁愿不使用反射来完成这一点

我有一节课,让我们说吧

public class exampleClass
{
  public string var1 = "one";
  public string var2 = "two";
  public int var3 = 3;
  public string var4 = "four";
  etc. etc..
}
我希望能够动态地遍历该类并打印出变量。我考虑过序列化,但不确定如何在这种情况下实现它(我能找到的唯一示例是XML,我不希望这样),而且我也不想以任何方式更改类的结构

我这样做的原因是因为我正在构建一个HTML表,并希望执行以下操作:

for(int i = 0; i < exampleClass.Count; i++)
  tbl_row = "<td>" + exampleClass[i] + "</td>";
for(int i=0;i
或者类似的东西。有什么建议吗?

最简单的方法是使用反射。这就足够了:

var example =  new exampleClass();

var allPublicFields = example.GetType().
       GetFields(BindingFlags.Public | BindingFlags.Instance );
使用字典,而不是字段:
字典
,但这是
设计简单的a StrightForward解决方案:在强类型类的清晰且可维护的结构上进行反射。

如果您不想使用反射,将数据存储在字典中而不是自定义类中如何?这样,您就可以根据需要在键或值上进行迭代。

使用构建HTML时完成相同的步骤

var tagBuilder=new tagBuilder(“tr”);
var exampleClass=新的exampleClass();
tagBuilder.InnerText+=“FieldValue”;
foreach(typeof中的变量字段(exampleClass)
.GetFields(BindingFlags.Public | BindingFlags.Instance))
{
var nameBuilder=新标记生成器(“td”);
var valueBuilder=新标记生成器(“td”);
nameBuilder.InnerHtml=field.Name;
valueBuilder.InnerHtml=field.GetValue(exampleClass).ToString();
tagBuilder.InnerHtml+=string.Format(“{0}{1}”,
nameBuilder.ToString(),
valueBuilder.ToString());
}
产出:

<tr>
    <td>Field</td><td>Value</td>
    <td>var1</td><td>one</td>
    <td>var2</td><td>two</td>
    <td>var3</td><td>3</td>
    <td>var4</td><td>four</td>
<tr>

字段值
瓦隆
var2two
var33
var4four

就我个人而言,我认为你最好进行反思。如果您使用.NET4或更高版本,并从中派生
exampleClass
,则可以实现您的目标


这与您想要做的事情非常相似。

好奇:为什么厌恶
系统。反射
?从技术上讲,这些是字段,而不是变量,读取它们最简单的方法是使用反射来保持项目的编码实践,而反射在其他任何地方都不使用。也希望尽量减少引用。我还尝试了反射,并在执行反射时得到一个空引用异常。如果你想(但仍然希望看到一个替代方案),我可以发表这篇文章,这可能不是一个有用的建议,但是如果编码标准允许类中的公共字段(变量),那么我建议编码标准需要更新,你应该可以自由地使用反射……在这种情况下,没有反射的替代方案,不是为了实现你想要的。您可以在javascript中执行类似操作,因为所有对象都是有效的关联数组。在C#中并非如此,没有什么可重复的。您必须使用反射或显式地一次一个地写入表行中的每个单元格。这与代码的格式背道而驰。这是一个视图模型,在其他地方也可以使用,所以我不想破坏代码来实现这一点。虽然使用DynamicObject肯定是实现此类功能的一种方式,但值得注意的是,提问者确实表示“我真的不想以任何方式更改类的结构”。我会假设更改exampleClass继承自的类会违反此要求。哎呀,我没有注意到:)我的建议是学术性的,无论如何,我不建议在这个实例中使用
DynamicObject
<tr>
    <td>Field</td><td>Value</td>
    <td>var1</td><td>one</td>
    <td>var2</td><td>two</td>
    <td>var3</td><td>3</td>
    <td>var4</td><td>four</td>
<tr>