2009-09-08 2 views
1

У меня есть класс, который получает объект из других неизвестных модулей, и поэтому мне нужно отразить объект, чтобы получить его данные, вызвать его методы, и т.д.Ищете .NET ObjectReflector, который поможет мне упростить отображение объекта

чтобы упростить код, чтобы отразить на объекте, я строю этот класс:

using System; 

namespace ApplicationCore.Helpers 
{ 
    class ObjectReflector 
    { 
     public object TheObject { get; set; } 
     public Type TheType { get; set; } 

     public ObjectReflector(object theObject) 
     { 
      TheObject = theObject; 
      TheType = theObject.GetType(); 
     } 

     public string GetObjectShortName() 
     { 
      return TheObject.GetType().Name; 
     } 

     public string GetObjectLongName() 
     { 
      return TheObject.GetType().ToString(); 
     } 

     public T GetPropertyValue<T>(string propertyName) 
     { 
      return (T)TheType.GetProperty(propertyName).GetValue(TheObject, null); 
     } 

     public T GetMethodValue<T>(string methodName, object[] parameters) 
     { 
      return (T)TheType.GetMethod(methodName).Invoke(TheObject, parameters); 
     } 

    } 
} 

Так что у меня есть хороший, чистый код, который выглядит следующим образом:

namespace ApplicationCore.Presenters 
{ 
    public class SmartFormPresenter 
    { 
     public UserControl View { get; set; } 

     public string ShortName { get; set; } 
     public string LongName { get; set; } 
     public string FirstName { get; set; } 
     public int Age { get; set; } 
     public int AgePlusTwo { get; set; } 

     public SmartFormPresenter(object o) 
     { 
      SmartFormView smartFormView = new SmartFormView(); 
      View = smartFormView; 
      smartFormView.DataContext = this; 

      ObjectReflector or = new ObjectReflector(o); 
      ShortName = or.GetObjectShortName(); 
      LongName = or.GetObjectLongName(); 
      FirstName = or.GetPropertyValue<string>("FirstName"); 
      Age = or.GetPropertyValue<int>("Age"); 
      AgePlusTwo = or.GetMethodValue<int>("GetAgeInTwoYears", null); 
     } 
    } 
} 

Но теперь мне нужно разработать методы, например. зачитывать не INT но , так что я буду иметь, чтобы получить List<object>, а затем отразить на «объект» и т.д.

Так что я имею в виду, что это было сделано раньше , Есть ли какой-либо инструмент или класс в .NET под названием ObjectReflector, который поможет мне упростить отражение объекта, как я делаю выше?

+0

Я бы не использовал имена свойств и методов напрямую. Вместо этого используйте деревья выражений linq, чтобы избежать их. Это делает рефакторинг более безопасным. –

+0

У меня есть имена методов и свойств в XML-файле в виде строк, которые мне нужно вызвать у моего неизвестного объекта. Как это будет работать в этом случае с деревьями выражений линга? –

+0

Если я правильно понял, что вы хотите извлечь коллекцию из вашего неизвестного объекта, а затем, в свою очередь, подумать об объектах коллекции? –

ответ

0

Не могу отправить код в мой комментарий. Это может вас заинтересовать:

foreach (PropertyInfo pi in oProps) 
      { 
       Type colType = pi.PropertyType; 

       if ((colType.IsGenericType) && (colType.GetGenericTypeDefinition()  
       ==typeof(Nullable<>))) 
       { 
        colType = colType.GetGenericArguments()[0]; 
       } 
Смежные вопросы