C#의 완벽한 클론 참조 유형 객체

우리는 모두 C#에서 복잡한 대상에 대해 매 매 매 매 매 매 매 매 매 매 매 변수 a를 성명하고 이 유형의 대상 A로 이 변수에 값을 부여할 때 사실은 이 변수 a가 대상 A를 가리키게 하고 메모리에 대상 A를 하나 더 생성하는 실례가 없다는 것을 안다.그래서 우리가 몇 개의 A와 같은 변수를 성명하든지 간에 실제로는 영원히 하나의 A만 메모리에 존재한다.이것이 바로 우리가 흔히 말하는 인용 유형의 특성이다.
인용 유형의 이 특성의 장점은 말로 설명할 수 없는 것이 아니지만 우리에게 약간의 불편을 가져왔다. 즉, 때때로 우리는 메모리에 두 개의 모든 속성 값이 똑같은 대상 A와 B가 있어야 한다. 이렇게 하면 B에 대해 조작하기 편하고 A. 어떤 사람은 그 New 두 번에 두 개의 똑같은 대상이 있지 않겠느냐고 말한다. 사실 그는 실제 조작 과정에서 대상 A가 사용자의 조작 때문에일부 속성이 변경되었습니다.New에서 나온 대상은 초기 상태 유형과 속성의 일치성을 확보할 수 있을 뿐, 실행할 때 바뀌는 속성에 대해서는 아무런 힘이 없습니다.즉, 이때 우리는 A 대상을 복제하여 현재 A 대상의 모든 속성 값을 새 대상에 가져가야 한다. 그러면 현재 두 대상의 일치성을 확보할 수 있다.코드를 보십시오:
///  ///  
/// /// ///
private object CloneObject(object o) { Type t =o.GetType(); PropertyInfo[] properties =t.GetProperties(); Object p =t.InvokeMember("", System.Reflection.BindingFlags.CreateInstance, null, o, null); foreach(PropertyInfo pi in properties) { if(pi.CanWrite) { object value=pi.GetValue(o, null); pi.SetValue(p, value, null); } } return p; }
 , :
TextBox t =(TextBox)CloneObject(textBox1);
 , , , DataGridView ,SetValue , . DataGridView :
///  ///  DataGridView  /// 
/// 
/// 
     
public static DataGridView CloneDataGridView(DataGridView dgv)
{
    try
    {
        DataGridView ResultDGV = new DataGridView();
        ResultDGV.ColumnHeadersDefaultCellStyle = dgv.ColumnHeadersDefaultCellStyle.Clone();
        DataGridViewCellStyle dtgvdcs = dgv.RowsDefaultCellStyle.Clone();
        dtgvdcs.BackColor = dgv.DefaultCellStyle.BackColor;
        dtgvdcs.ForeColor = dgv.DefaultCellStyle.ForeColor;
        dtgvdcs.Font = dgv.DefaultCellStyle.Font;
        ResultDGV.RowsDefaultCellStyle = dtgvdcs;
        ResultDGV.AlternatingRowsDefaultCellStyle = dgv.AlternatingRowsDefaultCellStyle.Clone();
        for (int i = 0; i < dgv.Columns.Count; i++)
        {
            DataGridViewColumn DTGVC = dgv.Columns[i].Clone() as DataGridViewColumn;
            DTGVC.DisplayIndex = dgv.Columns[i].DisplayIndex;
            if (DTGVC.CellType == null)
            {
                DTGVC.CellTemplate = new DataGridViewTextBoxCell();
                ResultDGV.Columns.Add(DTGVC);
            }
            else
            {
                ResultDGV.Columns.Add(DTGVC);
            }
        }
        foreach (DataGridViewRow var in dgv.Rows)
        {
            DataGridViewRow Dtgvr = var.Clone() as DataGridViewRow;
            Dtgvr.DefaultCellStyle = var.DefaultCellStyle.Clone();
            for (int i = 0; i < var.Cells.Count; i++)
            {
                Dtgvr.Cells[i].Value = var.Cells[i].Value;
            }
            if (var.Index % 2 == 0)
                Dtgvr.DefaultCellStyle.BackColor = ResultDGV.RowsDefaultCellStyle.BackColor;
            ResultDGV.Rows.Add(Dtgvr);
        }
        return ResultDGV;
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
    return null;
}

이제 아쉬움이 없어요.

좋은 웹페이지 즐겨찾기