2016-05-25 3 views
-3

Как и в Java, если мы объявляем параметризированный конструктор класса как:Создание типа экземпляра в C#

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

где _MAP определяется как:

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

В то время как в C#, мы будем использовать в качестве :
Type вместо Class<? extends Map>

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

вместо

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

EDIT
Действительное конструктор Java рассмотрен вопрос:

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

Поскольку не существует метода, как newInstance() в C#, и я не уверен, что Activator.CreateInstance() делает точно.

Как создать новый экземпляр объекта класса Type в C#, как это сделано при использовании java?

+0

Возможный дубликат [Создать экземпляр родового типа?] (Http://stackoverflow.com/questions/731452/create-instance-of-generic-type) – Hristo

+0

Как этот вопрос Java? – Underbalanced

+0

@Chris Ваш предложенный дублированный вопрос говорит о параметре less constructor, тогда как здесь параметризованный. И что ? – maliks

ответ

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 - это интерфейс IDictionary в C#. Словарь и карта не созданы равными Карта [invlaidkey] = NULL, словарь [invalidkey] = исключение

EDIT

Второй пример удовлетворяет EDIT раздел. Однако его не совсем эквивалентно в вашем примере, вы создаете экземпляр из типа, который в C# может быть достигнут с помощью Activator.CreateInstance(). Однако в C# у вас нет возможности ограничить (без написания некоторого отражения) типы, в которые они вошли. Даже тогда это ограничение времени выполнения, а не время компиляции. Поэтому я предлагаю использовать дженерики таким образом, что большая часть; если у вас нет особой необходимости создавать экземпляры неизвестных типов во время выполнения, которые вы еще не выразили.

+0

@ Mark - ну, вы инициализировали '_map' здесь в этом ответе , что относительно '(Class _mapType)' в вопросе? – maliks

+0

@ Mark - как мы будем размещать C# 'Type' здесь, есть ли его использование? – maliks

+0

Я так думаю, используя '_map = новый словарь ();' мы фактически создаем новый экземпляр. Fine – maliks

Смежные вопросы