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

dav*_*avy 1 c# generics

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

例如:

var myType = myVariable.GetType();
var myTestClass = new TestClass<myType>(); 
Run Code Online (Sandbox Code Playgroud)

这不会编译,但希望显示我想要实现的目标.

有办法吗?

编辑

说这个类是这样的:

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

    public T TypeValue { get; set; }  
}
Run Code Online (Sandbox Code Playgroud)

如果我做了类似的事情:

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)

Mar*_*ell 6

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

object myTestClass = Activator.CreateInstance(
    typeof(TestClass<>).MakeGenericType(myType));
Run Code Online (Sandbox Code Playgroud)

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

ITestClass myTestClass = (ITestClass) Activator.CreateInstance(
    typeof(TestClass<>).MakeGenericType(myType));
Run Code Online (Sandbox Code Playgroud)

您也可以作弊dynamic(为您做反射,并缓存优化的性能策略等):

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

  • 作弊+1 ..恶当 (2认同)