2013-06-21 65 views
3

要开始,我宁愿不使用反射来完成此操作。打印C类中的所有变量#

我有一个类可以说

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

好奇:为什么厌恶'System.Reflection'? – DonBoitnott

+6

从技术上讲,这些是字段,而不是变量,读取它们的最简单方法是使用反射 –

+0

试图与项目的编码实践保持一致,并且反射不在其他地方使用。还宁愿将参考文献保持在最低限度。我也尝试了反射,当我这样做时得到一个空引用异常。我可以张贴,如果你想(但仍想看到替代) – eric

回答

2

easisets的方式将是使用反思。这应该是足够了:

var example = new exampleClass(); 

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

使用字典,而不是字段:Dictionary<fieldName, fieldValue>,但是这是一种 超过工程简单的一个streghtforward解决方案:反射在你的强类型类的清晰maintanable结构。

1

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

+0

违背了代码的格式。这是一个视图模型,并在其他地方使用,所以我不想破坏代码来做到这一点。 – eric

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> 
1

就个人而言,我觉得你有反射更好。如果您使用.NET 4或更高版本,并且从DynamicObject派生exampleClass,则可以实现要尝试执行的操作。

example on this page与您所要做的非常相似。

+0

尽管使用DynamicObject当然是实现这种功能的一种方式,但值得注意的是,提问者并没有声明“我不是真的想要以任何方式改变类的结构”。我会假设更改哪些类的exampleClass继承将违背此要求。 – Chris

+0

哎呀,我错过了:)我的建议是学术,我不会推荐在这个实例中使用'DynamicObject'。 – dariom