C# MergePropertyDescriptor克隆值,而标准属性描述符不克隆值
我们有一个设置,其中属性网格用于设置特定给定类的属性。其中一些属性是对我们希望通过引用设置的其他类的引用。 对于这些属性,将设置一个适当的C# MergePropertyDescriptor克隆值,而标准属性描述符不克隆值,c#,winforms,propertygrid,C#,Winforms,Propertygrid,我们有一个设置,其中属性网格用于设置特定给定类的属性。其中一些属性是对我们希望通过引用设置的其他类的引用。 对于这些属性,将设置一个适当的UITypeEditor,并且当将属性网格与一个源类一起使用时,它将起作用 因为我们能够选择多个类并为它们设置属性,所以我们意识到了一个问题。 选择多个类并编辑属性时,PropertyDescriptor会传递到我们的CustomUITypeEditor中。EditValue是一个名为MergePropertyDescriptor的内部类 不幸的是,此描述符的
UITypeEditor
,并且当将属性网格与一个源类一起使用时,它将起作用
因为我们能够选择多个类并为它们设置属性,所以我们意识到了一个问题。
选择多个类并编辑属性时,PropertyDescriptor
会传递到我们的CustomUITypeEditor中。EditValue
是一个名为MergePropertyDescriptor
的内部类
不幸的是,此描述符的SetValue
使用以下代码调用了CopyValue
:
private object CopyValue(object value)
{
if (value == null)
return value;
Type type = value.GetType();
if (type.IsValueType)
return value;
object obj1 = (object) null;
ICloneable cloneable = value as ICloneable;
if (cloneable != null)
obj1 = cloneable.Clone(); // <!---------------------- class is cloned!
...
私有对象CopyValue(对象值)
{
如果(值==null)
返回值;
Type Type=value.GetType();
if(type.IsValueType)
返回值;
对象obj1=(对象)null;
ICLONABLE cloneable=ICLONABLE的值;
if(可克隆!=null)
obj1=cloneable.Clone()//