2016-04-25 2 views
0

Есть ли способ указать тип во время выполнения путем литья строки с именами типов? Я надеюсь, что мой некомпилирующий код ниже может объяснить, что я пытаюсь сделать. Дайте мне знать иначе, и я стараюсь объяснить это лучше.Строка каста для ввода

var valueFromDropDownMenu = "MyClass"; 

List<Type.GetType(valueFromDropDownMenu)> dynamicList = 
    new List<Type.GetType(valueFromDropDownMenu) >(); 

// Code to iterate through objects and populate dynamicList 
// with all objects of correct type 

Что я пытаюсь сделать, так это позволить пользователю выбрать, какой тип объекта я обработать.

Я использую Unity3D, который является картой разработчика игр, и использует статический метод для загрузки ресурсов из файлов. Эти ресурсы необходимо бросить.

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

var files = LoadAll("Path, ofType(UserSelectedType)); 

Возможно ли это?

+6

Посмотрите [здесь] (http://stackoverflow.com/questions/11107536/convert-string-to-type-in-c-sharp), это должно ответить на ваш вопрос. –

+1

Я знаю, что это не отвечает на ваш вопрос, но можно ли создать интерфейс, который все эти типы могли бы реализовать, т. Е. Вы хотите сделать ту же операцию независимо от того, какой тип она действительно получает? –

+0

'List ' не будет работать, но вам, скорее всего, это не понадобится. Я полагаю, у вас уже есть список предметов для поиска? Если да, почему бы не использовать один и тот же тип - так как все найденные объекты будут такого типа или подтипа, так или иначе? –

ответ

1

Весь смысл дженериков заключается в том, чтобы обеспечить типизацию во время компиляции. Попытка использовать дженерики в том виде, в котором вы описываете, поражает точку.

Он не компилируется, потому что вы пытаетесь смешивать время выполнения ввода с помощью набора команд.

Даже если это действительно сработало, оно просто добавит лишние накладные расходы к использованию простого List<object>, который затем может быть запрошен во время выполнения для информации о типе. (Примечание, время компиляции, очевидно, всегда предпочтительнее для производительности)

Код ниже будет выводить одну строку на консоли.

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace ConsoleApplication9 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 

      List<object> x = new List<object>(); 
      x.Add(new MyTypeA()); 
      x.Add(new MyTypeB()); 
      foreach (var itemsOfA in x.Where(o => o.GetType().Name == "MyTypeA")) 
      { 
       Console.WriteLine("Found a " + itemsOfA.GetType()); 
      } 
     } 
    } 

    class MyTypeA { } 
    class MyTypeB { } 
} 
+0

Спасибо за ваше время. Я думаю, что мой пример немного плох. То, что я пытаюсь сделать, это позволить пользователю выбрать, какой тип объекта я обработать. Я использую Unity3D, который представляет собой платформу игрового разработчика, и использует статический метод для загрузки ресурсов из файлов. Эти ресурсы необходимо бросить. Я пытаюсь создать инструмент разработчика, который позволяет разработчику выбирать определенный тип ресурсов для загрузки. – Lautaro

+0

(продолжение ...) Итак, мне нужно сделать что-то вроде файлов var = LoadAll («Path, ofType (UserSelectedType)); Возможно ли это? – Lautaro

+1

@Lautaro: вы можете добавить эту информацию на свой вопрос - в частности как вы получаете эти объекты и что вы намерены делать с ними. –

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