如何复制控件的全部属性

 我来答
魔法软糖™
2016-12-04 · TA获得超过839个赞
知道小有建树答主
回答量:822
采纳率:94%
帮助的人:152万
展开全部

复制全部属性数据也就是深度拷贝对象。

控件不能序列化,那就只有反射来实现深度拷贝了。

C#代码

    class 拷贝对象
    {
        public static T 反射深度拷贝<T>(T obj)
        {
            //如果是字符串或值类型则直接返回
            if (obj is string || obj.GetType().IsValueType) return obj;

            object retval = Activator.CreateInstance(obj.GetType());
            FieldInfo[] fields = obj.GetType().GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static);
            foreach (FieldInfo field in fields)
            {
                try { field.SetValue(retval, 反射深度拷贝(field.GetValue(obj))); }
                catch { }
            }
            return (T)retval;
        }
     }

调用方法,例如要拷贝Button1按钮

Button 新按钮 = 拷贝对象.反射深度拷贝<Button>(Button1);

VB代码

Imports System.Reflection

Public Class 拷贝对象

    Public Shared Function 反射深度拷贝(Of T)(obj As T) As T
        '如果是字符串或值类型则直接返回
        If (TypeOf obj Is String Or obj.GetType().IsValueType) Then Return obj

        Dim retval = Activator.CreateInstance(obj.GetType())
        Dim fields() = obj.GetType().GetFields(BindingFlags.Public Or BindingFlags.NonPublic _
            Or BindingFlags.Instance Or BindingFlags.Static)
        For Each field As FieldInfo In fields
            Try
                field.SetValue(retval, 反射深度拷贝(field.GetValue(obj)))
            Catch

            End Try
        Next
        Return retval
    End Function

End Class

调用方法,例如要拷贝Button1按钮

Dim 新按钮 As Button = 拷贝对象.反射深度拷贝(Of Button)(Button1)

写了这么多代码,如果满意的话,请及时采纳,谢谢。

灬溟风
2018-04-18
知道答主
回答量:1
采纳率:0%
帮助的人:889
引用魔法软糖K的回答:
复制全部属性数据也就是深度拷贝对象。
控件不能序列化,那就只有反射来实现深度拷贝了。
C#代码
class 拷贝对象 { public static T 反射深度拷贝<T>(T obj) { //如果是字符串或值类型则直接返回 if (obj is string || obj.GetType().IsValueType) return obj; object retval = Activator.CreateInstance(obj.GetType()); FieldInfo[] fields = obj.GetType().GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static); foreach (FieldInfo field in fields) { try { field.SetValue(retval, 反射深度拷贝(field.GetValue(obj))); } catch { } } return (T)retval; } }调用方法,例如要拷贝Button1按钮
Button 新按钮 = 拷贝对象.反射深度拷贝<Button>(Button1);VB代码
Imports System.ReflectionPublic Class 拷贝对象 Public Shared Function 反射深度拷贝(Of T)(obj As T) As T '如果是字符串或值类型则直接返回 If (TypeOf obj Is String Or obj.GetType().IsValueType) Then Return obj Dim retval = Activator.CreateInstance(obj.GetType()) Dim fields() = obj.GetType().GetFields(BindingFlags.Public Or BindingFlags.NonPublic _ Or BindingFlags.Instance Or BindingFlags.Static) For Each field As FieldInfo In fields Try field.SetValue(retval, 反射深度拷贝(field.GetValue(obj))) Catch End Try Next Return retval End FunctionEnd Class调用方法,例如要拷贝Button1按钮
Dim 新按钮 As Button = 拷贝对象.反射深度拷贝(Of Button)(Button1)写了这么多代码,如果满意的话,请及时采纳,谢谢。
展开全部
你这复制的东西没有属性!!!
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式