根据运行时变量的类型创建通用类

时间:2013-11-26 12:37:32

标签: c# generics

是否可以根据运行时变量的类型创建类型为T的类的实例?

例如:

var myType = myVariable.GetType();
var myTestClass = new TestClass<myType>(); 

这不会编译,但希望能够展示我想要实现的目标。

有办法吗?

修改

说课程是这样的:

public class TestClass<T>
{     
    public string StringValue
    {
        get
        {
            return this.TypeValue == null ? string.Empty : this.TypeValue.ToString();
        }   
    }

    public T TypeValue { get; set; }  
}

如果我做了类似的事情:

var test1 = TestClass((dynamic)x); // x is an int

我可以设置为test1.TypedValue = 10

如果我做了类似的事情:

var test2 = TestClass((dynamic)y); // y is a bool

我可以设置为test2.TypedValue = true

目前我收到错误陈述

  

不能将int类型隐式转换为TestClass(或bool转换为TesClass)

1 个答案:

答案 0 :(得分:6)

是的,但你必须使用反射:

object myTestClass = Activator.CreateInstance(
    typeof(TestClass<>).MakeGenericType(myType));

如果您的TestClass<T>实现了非泛型接口或具有非泛型基类,那么它将更有用:

ITestClass myTestClass = (ITestClass) Activator.CreateInstance(
    typeof(TestClass<>).MakeGenericType(myType));

你也可以欺骗dynamic(为你做反射,并缓存优化的性能策略等):

Evil((dynamic)myVariable);
...
void Evil<T>(T val)
{
    var myTestClass = new TestClass<T>();
    //...
}