Cast with GetType()

后端 未结 5 1893
无人及你
无人及你 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;
            }
        }
    }
    
    0 讨论(0)
  • 2020-12-15 03:43

    Your intent is very unclear; however, one option is generics and MakeGenericMethod in particular. What do you want to do with this? For example:

    static class Program
    {
        static void Main()
        {
            object obj = 123.45;
            typeof(Program).GetMethod("DoSomething")
                .MakeGenericMethod(obj.GetType())
                .Invoke(null, new object[] { obj });
        }
        public static void DoSomething<T>(T value)
        {
            T item = value; // well... now what?
        }    
    }
    

    So now we have the value, typed as double via generics - but there still isn't much we can do with it except for calling other generic methods... what was it you want to do here?

    0 讨论(0)
  • 2020-12-15 03:49

    You can use the Activator.CreateInstance method to create an instance from a type.

    FYI reflection is SLOOWWWW, so if you need to do this cast many times in a row, it may be better to define your types in an enum or something like this then create instances without using reflection.

    0 讨论(0)
  • 2020-12-15 03:50

    I can't think of why you'd want to cast as GetType(), because you wouldn't be able to do anything to useful with the result, without knowing the type at compile time anyway.

    Perhaps what you are looking for, is being able to Convert. If that is the case, the following should work for you:

    object input = GetSomeInput();
    object result = Convert.ChangeType(input, someOtherObject.GetType());
    

    We use this when reading values from the registry which are all stored as strings, and then stuffing them into properties using reflection.

    0 讨论(0)
  • 2020-12-15 03:53

    You can use getClass() which returns a Class object then use the cast method in the Class object to cast the object to an object of that Class's type, like so:

    myObj.getClass().cast(myObj)

    0 讨论(0)
提交回复
热议问题