【问题标题】:Cast Object to MyType<T> where T can be any type将对象转换为 MyType<T> 其中 T 可以是任何类型
【发布时间】:2012-09-19 08:23:35
【问题描述】:

我有一些代码可以在程序集中搜索所有类型的MyType&lt;T&gt;T 可以是我使用Activator.CreateInstance 创建这些类型的对象的任何类型。我需要将这些对象传递给一个期望 MyType&lt;T&gt; 的方法,所以我需要以某种方式将每个对象从 Object(由 Activator.CreateInstance 返回)转换为 MyType&lt;T&gt;

【问题讨论】:

  • 你能提供一个你想要完成的代码示例吗?
  • 下面的代码是否符合您的问题并解决了问题?

标签: c# .net c#-4.0 asp.net-4.5


【解决方案1】:

您需要的是 GetGenericTypeDefinition - MakeGenericType 组合来形成您自己的新类型。这是一个例子:

    public class  GenericTypeTest<T>
    {
        T value;
    }

    void MakeTest()
    {
        var newType = typeof(double);
        var customType = typeof(GenericTypeTest<object>).GetGenericTypeDefinition().MakeGenericType(newType);
        var createdObject = Activator.CreateInstance(customType);
    }

如果你想使用 createdObject,它有点复杂,因为你不能“硬编码”任何东西:

    public class  GenericTypeTest<T>
    {
        public GenericTypeTest(T value)
        {
            this.value = value;
        }
        public T value {get; protected set; }
    }

    public void ShowSomething<T>(GenericTypeTest<T> genericContainer)
    {
         MessageBox.Show(genericContainer.value.ToString());
    }

    void MakeTest()
    {
        var newType = typeof(double); object newValue = 1.0;

        var customType = typeof(GenericTypeTest<object>).GetGenericTypeDefinition().MakeGenericType(newType);
        var createdObject = Activator.CreateInstance(customType, newValue);

        this.GetType().GetMethod("ShowSomething").MakeGenericMethod(newType).Invoke(this, new object[] { createdObject });
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    • 2020-04-16
    相关资源
    最近更新 更多