Cast with GetType()

后端 未结 5 1912
无人及你
无人及你 2020-12-15 03:13

Is it possible to cast an object to the type returned from GetType()? I\'d like a generic method that can accept an object (for anonymous types) but then return

5条回答
  •  难免孤独
    2020-12-15 03:29

    I have a class that I use for change tracking in my Windows Forms app because not all items were databound. Most items were TextBox controls, but there were ComboBox and DateTimePicker controls as well.

    For simplicity, my HasChanged property tests the generic Windows.Forms.Control to see if it is a ComboBox, but you could test whatever types of controls you add to your Windows Form.

    Below is that class - if it helps for anyone.

    internal class DataItem
    {
        private static Color originalBackColor, changedBackColor, originalForeColor, changedForeColor;
        private static Font originalFont, changedFont;
    
        static DataItem()
        {
            originalBackColor = SystemColors.Control;
            changedBackColor = SystemColors.HighlightText;
            originalForeColor = Color.Black;
            changedForeColor = Color.Red;
            originalFont = new Font(FontFamily.GenericSansSerif, 12.5f);
            changedFont = new Font(originalFont, FontStyle.Bold);
        }
    
        public static void ChangeSetup(Control original, Color changedBackgroundColor)
        {
            originalBackColor = original.BackColor;
            originalForeColor = original.ForeColor;
            originalFont = original.Font;
            changedBackColor = changedBackgroundColor;
            changedFont = new Font(originalFont, FontStyle.Bold);
        }
    
        private bool changeTracking;
    
        public DataItem(Control control, Object value)
        {
            this.Control = control;
            var current = String.Format("{0}", Control.Text).Trim();
            if (Control is ComboBox)
            {
                var cbo = (ComboBox)Control;
                current = cbo.StateGet();
            }
            this.OriginalValue = current;
            this.Control.TextChanged += Control_TextChanged;
            changeTracking = true;
        }
    
        public Control Control { get; private set; }
    
        private void Control_TextChanged(Object sender, EventArgs e)
        {
            if (TrackingChanges)
            {
                if (HasChanged)
                {
                    this.Control.BackColor = originalBackColor;
                    this.Control.Font = originalFont;
                    this.Control.ForeColor = originalForeColor;
                }
                else
                {
                    this.Control.BackColor = changedBackColor;
                    this.Control.Font = changedFont;
                    this.Control.ForeColor = changedForeColor;
                }
            }
        }
    
        public bool HasChanged
        {
            get
            {
                var current = String.Format("{0}", Control.Text).Trim();
                if (Control is ComboBox)
                {
                    var cbo = (ComboBox)Control;
                    current = cbo.StateGet();
                }
                return !current.Equals(OriginalValue);
            }
        }
    
        public String OriginalValue { get; private set; }
    
        public void Reset()
        {
            changeTracking = false;
            this.OriginalValue = String.Empty;
            this.Control.Text = String.Empty;
            this.Control.BackColor = originalBackColor;
            this.Control.Font = originalFont;
            this.Control.ForeColor = originalForeColor;
        }
        public bool TrackingChanges
        {
            get
            {
                return changeTracking;
            }
        }
    }
    

提交回复
热议问题