简单问题:C#中的反思

时间:2011-09-12 15:41:35

标签: c# reflection

我正在学习c#中的思考概念。我有一个这样的课程

public class pdfClass
{
    public List<AttributeProperties> TopA { get; set; }
    public List<AttributeProperties> TopB { get; set; }
    public List<AttributeProperties> TopC { get; set; }

}

在另一个类中,我想从列表中提取值。我有愚蠢的方法像

那样做
public void ExtractValue (pdfClass incomingpdfClass, string type)
{
 switch (type)
 {
   case "TopA":
   foreach (var listitem in incomingPdfClass.TopA)
   {...} 
   breaks;
   case "TopB":
   foreach (var listitem in incomingPdfClass.TopB)
   {...} 
   breaks;
   ...
 }
}

foreach循环中的操作类似。如何通过使用反射以清晰的方式完成此操作?

3 个答案:

答案 0 :(得分:7)

public void ExtractValue(pdfClass incomingpdfClass, string type)
{
  PropertyInfo pinfo = typeof(pdfClass).GetProperty("Top" + type);
  var yourList = pinfo.GetValue(incomingpdfClass);
  foreach (var listitem in yourList)
  { ... }
}

这是你应该如何使用反射来做到这一点。但是,您应该注意到我的代码与您的代码不同之处在于您编写的代码不清楚也不会编译。 AS

public class ExtractValue (pdfClass incomingpdfClass, string type)

是无效的C#语法,如果它应该是一个函数,根据我的例子这将适合你

或者如果这应该发生在类的Constructor中,它应该如下所示

public class ExtractValue
{
   public ExtractValue(pdfClass incomingpdfClass, string type)
   {
     PropertyInfo pinfo = typeof(pdfClass).GetProperty("Top" + type);
     var yourList = pinfo.GetValue(incomingpdfClass);
     foreach (var listitem in yourList)
     { ... }
   }
}

答案 1 :(得分:1)

var property = this.GetType().GetProperty(type);
foreach (var item in (List<AttributeProperties>)property.GetValue(this, null))
{

}

答案 2 :(得分:1)

如果您有pdfClass实例,则无需使用反射来访问列表。 我建议通过坚持这样的字典来将类型与策略本身分离:

IDictionary<string, Func<pdfClass, AttributeProperties, bool>>  strategy;

一旦添加了

之类的关系
 strategy.Add("TopA", (pdf, item) =>  
               { 
                 return pdf.TopA.IndexOf(item) >= 0; 
               });

并使用

string itemType = "TopA";
if (strategy.ContainsKey(itemType) )
{
  bool found = strategy[itemType](incommingPdfClass, listItem);
}