GetValue of PropertieInfo вызывает исключение TargetParameterCountException (System.Reflection)

Я по ошибке разместил этот вопрос уже в части SharePoint.

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

Я уже пытался использовать все пять параметров вместо одного (как описано здесь Moq + Модульное тестирование — System.Reflection.TargetParameterCountException: несоответствие количества параметров), но, к сожалению, я получу такое же исключение. Я был бы очень признателен, если бы кто-то мог мне помочь.

С уважением и благодарностью

Сандро

Это фрагмент исходной модели, все остальные свойства реализованы точно так же:

public class DataModel : Dictionary<string, object> {}
public class DiscussionDataModel : DataModel
{
  public DiscussionDataModel(Dictionary dictionary) : base(dictionary){}

  public FieldUserValue Author
  {
    get { return (FieldUserValue) this["Author"]; }
    set { this["Author"] = value; }
  }

  public double AverageRating
  {
    get { return (double) this["AverageRating"]; }
    set { this["AverageRating"] = value; }
  }
}

И это выдержка из целевой модели, все остальные свойства реализованы точно так же:

public class DiscussionModel : BaseModel
{
  public FieldUserValue Author { get; set; }
  public double AverageRating { get; set; }
}

И это общий метод расширения для сопоставления DataModel с BaseModel:

public static T ToModel(this DataModel dataModel) where T : BaseModel
{
  try
  {
    T model = Activator.CreateInstance();
    if (dataModel != null)
    {
      PropertyInfo[] propertyInfos = dataModel.GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public);

      foreach (PropertyInfo propertyInfo in propertyInfos)
      {
        object value = propertyInfo.GetValue(dataModel);
        if (value == null) { break; }
        PropertyInfo modelPropertyInfo = model.GetType().GetProperty(propertyInfo.Name);
        modelPropertyInfo?.SetValue(model, value);
      }
      return model;
    }
  }
  catch (Exception ex)
  {
    throw;
  }
  return null;
}

person Sandro Paetzold    schedule 26.04.2016    source источник


Ответы (1)


Проблема в том, что свойство Item индексируется, т.е. имеет параметр. C# обычно не позволяет этого, но другие языки .NET, такие как VB.NET, позволяют. Таким образом, эта концепция известна CLR, а значит, и Reflection. В C# есть только один способ создать индексированное свойство, а именно через индексатор. Что это делает на уровне CLR, так это создает индексированное свойство с именем Item, так что вы, возможно, только что наткнулись на индексатор.

Таким образом, решение состоит в том, чтобы проверить информацию о свойстве, есть ли у него параметры, и продолжить цикл for, если это так. У вас нет возможности узнать, какие объекты передавать в индексированное свойство.

person Georg    schedule 26.04.2016