c # отражение общего класса шаблона - PullRequest
1 голос
/ 23 августа 2010

После примера моего кода:

public abstract class<T>
{
   public List<T> GetSomething(string q)
   {
      **List<T> list = new List<T>();**

      Type type = typeof(T);
      PropertyInfo[] props = type.GetProperties(BindingFlags.Public | BindingFlags.IgnoreCase | BindingFlags.Instance);

      foreach (PropertyInfo info in props)
      {
          // at this point I need to return information from a data source query
          // and build the members (set values) according to the returning results
          // which needs to be added to a list that contains T with each property
          // within set to a value. "Some Value" should be an object instance required
          // by the Type of the PropertyInfo.

          info.SetValue(type, "Some Value", null);
          **list.Add(type);**
      }
   }

   **return list;**
}

info.SetValue (объект, объект, объект []) не доступен, из-за типа шаблона, правильно?Мой вопрос здесь будет таким: как я могу установить значение для свойства, содержащегося в T?

Редактировать: Вопрос смутил даже меня.Я изменил процедуру выше, чтобы представить мои прямые потребности.

Спасибо, Эрик

Ответы [ 2 ]

2 голосов
/ 23 августа 2010

Я не понимаю, как это имеет смысл. Вы пытаетесь установить свойство для экземпляра T (как показано вашими флагами привязки), но передаете typeof(T) - Type - PropertyInfo.SetValue Первый аргумент. Возможно, вы имеете в виду:

public abstract class Foo<T> 
{ 
   public List<T> GetSomethingFrom(T instance) 
   { 
      Type type = typeof(T); 
      PropertyInfo[] props = type.GetProperties(BindingFlags.Public |
           BindingFlags.IgnoreCase | BindingFlags.Instance); 

      foreach (PropertyInfo info in props) 
      { 
          info.SetValue(instance, "Some Value", null); 
      } 
   } 
} 

В этом случае мы передаем экземпляр T методу GetSomethingFrom, а затем передаем его в SetValue. Следуйте

-Oisin

0 голосов
/ 23 августа 2010

Вероятно, было бы неплохо утверждать, что свойства, которые вы устанавливаете, на самом деле также являются строками, или ваш вызов SetValue (экземпляр, «Некоторое значение», ноль) сгенерирует.

Похоже, вы пытаетесь создать общий инициализатор объекта. Отражение будет работать, но я бы порекомендовал исследовать пространство имен System.Linq.Expressions. Вы можете использовать отражение, чтобы построить выражение LambdaExpression, которое вы можете динамически скомпилировать в метод, который будет иметь гораздо лучшую производительность, чем каждый раз инициализировать ваши объекты с отражением.

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