首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GetValue of PropertieInfo throws (System.Reflection)

GetValue of PropertieInfo throws (System.Reflection)
EN

Stack Overflow用户
提问于 2016-04-26 06:44:29
回答 1查看 2.2K关注 0票数 5

我错误地将这个问题发布在SharePoint部分。

我需要把一个模型映射到另一个模型上。一切运行良好,但最后一个属性抛出一个TargetParameterCountException。抛出异常的属性称为"Item“--这个属性不是由我定义的,我假设这是字典中的一个属性。

我已经尝试使用所有五个参数,而不是仅使用一个参数(如这里所描述的,Moq + Unit Testing - System.Reflection.TargetParameterCountException: Parameter count mismatch),但不幸的是,我将得到相同的异常。如果有人能帮我,我会很感激的。

金德问候和感谢

桑德罗

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

代码语言:javascript
复制
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; }
  }
}

这就是目标模型的摘录,所有其他属性都以完全相同的方式实现:

代码语言:javascript
复制
public class DiscussionModel : BaseModel
{
  public FieldUserValue Author { get; set; }
  public double AverageRating { get; set; }
}

这是将DataModel映射到BaseModel的通用扩展方法:

代码语言:javascript
复制
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;
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-04-26 06:50:27

问题是Item属性是索引的,也就是说它有一个参数。C#通常不允许这样做,但其他.NET语言(如VB.NET )允许这样做。因此,CLR和Reflection都知道这个概念。在C#中,创建索引属性的方法只有一种,即通过索引器。这在CLR级别上所做的是创建一个名为Item的索引属性,所以您可能只是偶然发现了一个索引器。

因此,解决方案是检查属性信息是否有参数,如果是这样的话,继续for循环。您不可能泛泛地知道要传递给索引属性的对象。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36857188

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档