Простой вопрос: размышления в C # - PullRequest
5 голосов
/ 12 сентября 2011

Я изучаю концепции отражений в 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 ]

7 голосов
/ 12 сентября 2011
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 голос
/ 12 сентября 2011

Если у вас есть экземпляр 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);
}
1 голос
/ 12 сентября 2011
var property = this.GetType().GetProperty(type);
foreach (var item in (List<AttributeProperties>)property.GetValue(this, null))
{

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...