使用GetType()进行转换

时间:2009-02-17 03:42:42

标签: c# reflection casting

是否可以将对象强制转换为GetType()返回的类型?我想要一个可以接受对象(对于匿名类型)的泛型方法,但然后返回一个对象强制转换为匿名类型。我一直在考虑使用LCG DynamicMethod在容器类上构建一个方法,但我无法弄清楚它会是什么样子。使用GetType()方法进行强制转换的想法是能够获取匿名类型并将对象强制转换为实际类型,而无需实际知道类型。

总体目标是将匿名类型的对象粘贴到容器中,然后我可以在方法之间共享和传递。

5 个答案:

答案 0 :(得分:39)

我想不出为什么你想要转换为GetType(),因为无论如何在编译时都不知道类型的情况下,你将无法对结果有用。

也许您正在寻找的是能够转换。如果是这种情况,以下内容适合您:

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

我们在从注册表中读取所有存储为字符串的值,然后使用反射将它们填充到属性中时使用它。

答案 1 :(得分:15)

你的意图很不清楚;但是,一个选项是泛型,特别是MakeGenericMethod。你想用这个做什么?例如:

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?
    }    
}

所以现在我们有了值,通过泛型输入double - 但除了调用其他泛型方法之外,我们仍然无法做很多事情......什么是你想在这做什么?

答案 2 :(得分:4)

您可以使用Activator.CreateInstance方法从类型创建实例。

FYI反射是SLOOWWWW,因此如果您需要连续多次执行此操作,最好在枚举或类似内容中定义类型,然后在不使用反射的情况下创建实例。

答案 3 :(得分:0)

我在我的Windows Forms应用中使用了一个用于更改跟踪的课程,因为并非所有项目都是databound。大多数项目都是TextBox控件,但也有ComboBoxDateTimePicker控件。

为简单起见,我的HasChanged属性测试通用Windows.Forms.Control以查看它是否是 ComboBox ,但您可以测试添加到Windows窗体的任何类型的控件

以下是该课程 - 如果它对任何人都有帮助。

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;
        }
    }
}

答案 4 :(得分:-3)

您可以使用返回Class对象的getClass(),然后使用Class对象中的cast方法将对象强制转换为该Class类型的对象,如下所示:

myObj.getClass()。铸件(MyObj中)