例如,在Java中,如果我有参数化类,是否可以执行以下操作?
public class MyClass<T>{
public void aMethod {
..
T object = new T();
..
}
..
}
Run Code Online (Sandbox Code Playgroud)
在Java中,我认为这是不可能的,因为编译器不知道要调用什么构造函数.但在C#?我不懂语言而且我读过很多黑暗的东西都可以做,所以我只是想知道..
如果要在T类型上设置约束以使其具有无参数构造函数,则可以在C#中实现.
public class MyClass<T> where T:new(){
public void aMethod {
..
T object = new T();
..
}
..
}
Run Code Online (Sandbox Code Playgroud)
看到这里.
就像Donut说的那样,C#允许你在运行时实例化任意类型,Activator.CreateInstance就像Class<?>.newInstance在Java中一样.由于C#的Generics在编译后保留,因此与Java不同,C#允许您获取Type给定类型参数的实例,从而调用CreateInstance或任何其他构造函数.
对于无参数构造函数,使用通用约束会相当容易:
void <T> T createT() where T : new()
{
return new T();
}
Run Code Online (Sandbox Code Playgroud)
这里的关键是where T : new().
在一般情况下,使用反射,您可以使用以下内容:
void <T> T createT()
{
var typeOfT = typeof(T);
return (T) Activator.CreateInstance(typeOfT, new object[] { arg1, arg2 … });
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2160 次 |
| 最近记录: |