首先,我宁愿不使用反射来实现这一点。
我有一个课可以说
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>";
或类似的东西。有什么建议吗?
答案 0 :(得分:2)
easisets方式是使用反射。这应该足够了:
var example = new exampleClass();
var allPublicFields = example.GetType().
GetFields(BindingFlags.Public | BindingFlags.Instance );
使用字典而不是字段:Dictionary<fieldName, fieldValue>
,但这是
善意 over 设计简单明了的解决方案:对强类型类的清晰和可维护的结构进行反思。
答案 1 :(得分:1)
如果您不想使用反射,那么如何将数据存储在字典中,而不是存储在自定义类中?这样,您可以根据需要简单地迭代键或值。
答案 2 :(得分:1)
使用TagBuilder
构建HTML完全相同。
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>
答案 3 :(得分:1)
就个人而言,我认为你的反思会更好。如果您使用的是.NET 4或更高版本并从DynamicObject
派生exampleClass
,则可以实现您要执行的操作。
example on this page非常类似于您的目标。