的PropertieInfo的GetValue抛出TargetParameterCountException(System.Reflection)

我错误地已经在SharePoint部分发布了此问题.

我需要将一个模型映射到另一个模型.一切正常,但最后一个属性引发TargetParameterCountException.引发异常的属性称为“项”,该属性不是我定义的,我认为这是词典中的属性.

我已经尝试使用所有五个参数,而不是仅使用一个(如此处Moq + Unit Testing – System.Reflection.TargetParameterCountException: Parameter count mismatch所述),但不幸的是,我会遇到相同的异常.如果有人可以帮助我,我将不胜感激.

亲切的问候和感谢

桑德罗

这是源模型的摘录,所有其他属性的实现方式完全相同:

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;
}

解决方法:

问题在于Item属性已建立索引,即它具有一个参数. C#通常不允许这样做,但是其他.NET语言(例如VB.NET)允许这样做.因此,CLR知道了这一概念,因此反射也知道了这一概念.在C#中,只有一种创建索引属性的方法,即通过索引器.这在CLR级别的作用是创建一个称为Item的索引属性,因此您可能偶然发现了索引器.

因此,解决方案是检查属性信息是否具有参数,并在这种情况下继续for循环.您没有机会大致了解将哪些对象传递给索引属性.

上一篇:C#编写OPC客户端读取OPC服务器的数据(最高效简洁版)


下一篇:具有SubClasses的PropertyInfo的C#GetValue