2016-09-01 3 views
1

Я пытаюсь написать универсальный метод, который будет принимать любой тип и создать его экземпляр, так что я могу использовать его позже:ссылаться на экземпляр класса по его типу

Пример класса, который я хочу, чтобы динамически генерировать:

public class bb_ColorScaleCriteriaTypes 
    { 
     public Dictionary<string, int> Types { get; set; } 
     public bb_ColorScaleCriteriaTypes() 
     { 
      this.Types = new Dictionary<string, int>() 
      { 
       {"LowestValue", 1}, 
       {"Number", 0}, 
       {"Percent", 3}, 
       {"Formula", 4}, 
       {"Percentile", 5}, 
       {"HighestValue", 2}, 
       {"AutomaticMax", 7}, 
       {"AutomaticMin", 6}, 
       {"None", -1} 
      }; 
     } 

     public static int byName(string name) 
     { 
      if (name == null) 
      { 
       throw new ArgumentException("name"); 
      } 
      int intValue = new bb_ColorScaleCriteriaTypes().Types[name]; 
      return intValue; 
     } 
    } 

Нормально у меня есть еще один класс, который я могу назвать так:

public class bb_ColorScaleCriteriaTypesUI : DSDropDownBase 
    { 
     private const string NO_FAMILY_TYPES = "No types were found."; 
     public bb_ColorScaleCriteriaTypesUI() : base("Color Scale Criteria Type") { } 

     // Get Data Class that holds dictionary 
     public static bb_ColorScaleCriteriaTypes cscTypes = new bb_ColorScaleCriteriaTypes(); 

     protected override SelectionState PopulateItemsCore(string currentSelection) 
     { 
      Items.Clear(); 

      Dictionary<string, int> d = new Dictionary<string, int>(cscTypes.Types); 
     } 

Как вы можете видеть, я инстанцирование класса bb_ColorScaleCriteriaTypes и последующий вызов типов на Это. Тем не менее, я хочу написать более общую реализацию, где я мог бы просто сделать что-то похожее на это:

public abstract class bb_ColorScaleCriteriaTypesUI : DSDropDownBase 
    { 
     public bb_ColorScaleCriteriaTypesUI (string name, Type elementType) : base(name) { this.ElementType = elementType; PopulateItems(); } 

     private const string noTypes = "No Types available."; 
     public Type ElementType; 

     // how to instantiate an instance of ElementType here? 

     protected override SelectionState PopulateItemsCore(string currentSelection) 
     { 
      if (this.ElementType != null) 
      { 
      Dictionary<string, int> d = new Dictionary<string, int>(myTypeInstance.Types); //so I can call it here 
     } 

Похоже, это стало немного из стороны в комментариях действительно быстро.

В любом случае, я не возражаю против использования Activator.CreateInstance(), но как я могу создать экземпляр типа и вернуть его к типу, чтобы его не являлся общим объектом?

+0

Похоже, что вы ищете [Activator.CreateInstance()] (https://msdn.microsoft.com/en-us/library/system.activator.createinstance (v = vs.110) .aspx). – itsme86

ответ

3

Activator.CreateInstance(), как говорили другие. Тип возврата - это не общий объект, его фактический тип, который вы запросили, его просто вернули как объект, потому что это базовый класс всего.

Если вы хотите сделать это «правильным способом», вы бы определили интерфейс или базовый класс, из которого все ваши классы получают/реализуют, и имеют общие методы, которые необходимо вызывать в общем случае в интерфейсе/базе класс. Затем вы можете использовать Activator.CreateInstance() или фабричный шаблон для новых объектов и вернуть их в качестве интерфейса/базового класса.

+0

У вас есть идеи для образца, который я разместил ниже? Я стараюсь следовать вашему предложению, но ударил еще один блокпост. – konrad

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