在C#中创建Type实例

时间:2016-05-25 13:29:41

标签: c# .net generics

与Java一样,如果我们将类的参数化构造函数声明为:

public KeyCountMap(Class<? extends Map> _mapType)
{
   _map = _mapType.newInstance();
}  

其中_map定义为:

private Map<T, MutableInt> _map = new LinkedHashMap<T, MutableInt>();  

在C#中,我们将使用as:
Type代替Class<? extends Map>

private Dictionary<T, MutableInt> _map = new Dictionary<T, MutableInt>();  

而不是

private Map<T, MutableInt> _map = new LinkedHashMap<T, MutableInt>();  

修改
考虑的实际Java构造函数是:

@SuppressWarnings({ "unchecked", "rawtypes" })
public KeyCountMap(Class<? extends Map> _mapType) throws InstantiationException, IllegalAccessException 
{
    _map = _mapType.newInstance();
}

由于C#中没有类似newInstance()的方法,我不确定Activator.CreateInstance()究竟是做什么的。

我们如何在使用java时在C#中创建类Type的对象的新实例?

1 个答案:

答案 0 :(得分:0)

public class KeyCountMap<T> 
{

    private readonly IDictionary<T,MutableInt> _map;

    public KeyCountMap(){

        _map = new Dictionary<T,MutableInt>();
    }
}

public class KeyCountMap<T> where T: IDictionary<T, MutableInt>, new()
    {

        private readonly T _map;

        public KeyCountMap()
        {

            _map = new T();
        }
    }

还记得java中的map是c#中的接口IDictionary。字典和地图不是等于Map [invlaidkey] = null,Dictionary [invalidkey] = exception

修改

第二个示例满足 EDIT 部分。但是,在您的示例中,您可以通过使用Activator.CreateInstance()来实现从c#中构造实例的实例。但是在c#中你没有办法约束(没有写一些反射)传入的类型。即使这样,这也是运行时约束而不是编译时间。所以我建议大部分都使用泛型;除非您特别需要在运行时实例化尚未表达的未知类型。