3

首先,我宁愿不使用反射来完成此任务。

我有一堂课让我们说

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>";

或类似的东西。有什么建议么?

4

4 回答 4

2

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

var example =  new exampleClass();

var allPublicFields = example.GetType().
       GetFields(BindingFlags.Public | BindingFlags.Instance );

使用字典,而不是 fields: Dictionary<fieldName, fieldValue>,但这有点过分设计简单的强型解决方案:反射强类型类的清晰和可维护的结构。

于 2013-06-21T13:03:19.017 回答
1

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

于 2013-06-21T13:04:10.443 回答
1

使用TagBuilder.

var tagBuilder = new TagBuilder("tr");
var exampleClass =  new exampleClass();

tagBuilder.InnerText += "<td>Field</td><td>Value</td>";

foreach(var field in typeof(exampleClass)
                         .GetFields(BindingFlags.Public | BindingFlags.Instance))
{
    var nameBuilder = new TagBuilder("td");
    var valueBuilder = new TagBuilder("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>
于 2013-06-21T13:06:35.517 回答
1

就个人而言,我认为你最好通过反思。如果您使用 .NET 4 或更高版本并exampleClassDynamicObject.

此页面上的示例与您要执行的操作非常相似。

于 2013-06-21T13:13:45.810 回答