【问题标题】:Clone an Objects Properties克隆对象属性
【发布时间】:2016-08-05 14:33:55
【问题描述】:

我正在尝试克隆ListView 的所有属性,这样我就不必使用一行代码单独复制每个属性,但经过多次尝试,我未能使其正常工作。 我现在得到错误:

调用的目标已抛出异常。

我对如何设置属性的理解都错了吗?

private ListView generateEmptyClone(ListView toClone)
{
    ListView newCopy = new ListView();

    foreach (var propToClone in toClone.GetType().GetProperties())
    {
        PropertyInfo propInfo = newCopy.GetType().GetProperty(propToClone.Name);
        if (propInfo.CanWrite)
            propInfo.SetValue(newCopy, propToClone.GetValue(toClone, null));
    }

    return newCopy;
}

【问题讨论】:

  • 可能试图读取一些私有财产?我猜你的TargetInvocationException 有一个内部异常,可以告诉你实际出了什么问题。

标签: c# listview object clone


【解决方案1】:

正如 René Vogt 在他的评论中提到的,使用是访问私有属性。使用BindingFlags 将属性限制为您真正需要的属性。

【讨论】:

    【解决方案2】:

    PropertyInfo.CanWrite 属性仅告诉您该属性是否具有设置器。它不会告诉您该属性是否为public

    您应该只枚举public 实例属性,如下所示:

    foreach (var propToClone in toClone.GetType().
                  GetProperties(BindingFlags.Instance | BindingFlags.Public))
    {
        PropertyInfo propInfo = newCopy.GetType().GetProperty(propToClone.Name);
        if (propInfo.CanWrite)
            propInfo.SetValue(newCopy, propToClone.GetValue(toClone, null));
    }
    

    static 属性对于所有 ListView 实例已经相等,因此您无需枚举它们。


    虽然可以通过反射设置private 字段(使用GetFields())我认为在您的情况下这不是必需的,因为您可能只想克隆“正常” ListView 属性。

    如果您仍然得到TargetInvocationException,则可能是另一个问题。 TargetInvocationExceptions 通常有一个InnerException,它会告诉你到底出了什么问题。例如,如果您在克隆Items 之前克隆SelectedIndexproperty,这可能会导致IndexOutOfRangeException。但是克隆 hte Items 本身可能容易出错。

    【讨论】:

      猜你喜欢
      • 2015-02-08
      • 1970-01-01
      • 2017-04-26
      • 1970-01-01
      • 1970-01-01
      • 2015-02-04
      • 1970-01-01
      • 1970-01-01
      • 2018-08-08
      相关资源
      最近更新 更多