2011-01-26 4 views
14

У меня есть этот код:Объявите переменную, используя тип переменной

Type leftType = workItem[LeftFieldName].GetType(); 

Затем я хочу объявить переменную этого типа:

leftType someVar; 

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

+2

Нет, у вас нет. Подумайте об этом, и вы поймете, что такая переменная была бы совершенно бесполезной. – SLaks

+0

Что вы пытаетесь достичь? Возможно, есть еще один способ решить вашу проблему. – Trinidad

ответ

20

Вы можете сделать что-то подобное и передать их известному интерфейсу.

var someVar = Convert.ChangeType(someOriginalValue, workItem[LeftFieldName].GetType()); 
var someVar = Activator.CreateInstance(workItem[LeftFieldName].GetType()); 

Если заменить var с dynamic (и вы используете .NET 4), вы можете вызвать методы, которые вы ожидать на объекте someVar. Если они не существуют, вы просто получите исключение MissingMethodException.

+0

Спасибо! Только то, что мне было нужно. –

+0

Кажется, что-то вроде работы. Это лучший способ сделать что-то! Нет другого (лучшего) способа создания переменных динамических типов? –

+1

@MoheTheDreamy Несмотря на то, что это самый простой способ ** для создания переменных: 'var someVar = workItem [LeftFieldName]', тем не менее ** это небезопасно **, потому что вы можете случайно ** изменить ** (в случае * ссылочного типа *) ** значение ** исходного объекта. Я бы рекомендовал вам придерживаться стратегии, описанной в ответе [Austin] (https://stackoverflow.com/questions/4800446/declare-a-variable-using-a-type-variable/4800501#4800501) ('var someVar = Activator.CreateInstance (workItem [LeftFieldName] .GetType());') –

1

Вы не можете этого сделать.

Вы можете использовать dynamic типа для .Net 4, но для более ранних версий .Net, единственный тип, который будет соответствовать является object, что вам нужно будет вручную бросить позже снова испытывать .GetType() на то, что вы назначили object переменная типа.

Reading: SO link: whats-the-difference-between-dynamicc-4-and-var

+4

Не знаете, как это применимо. Использование «var» здесь не имеет значения. – Joe

+0

Вы можете заметить, что я изменил 'var someVar;' на 'var someVar =', который присваивает ему, затем неявно набирает 'someVar'. Это ускользает от типизации 'someVar', что и было после OP. Например, не нужно вычислять тип столбца db. – RichardTheKiwi

+2

Надеюсь, вы знаете, что * var * ALWAYS будет разрешен к определенному типу во время компиляции! –

8

Это не представляется возможным.

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

Возможно, вы ищете ключевое слово dynamic.

+0

Возможный случай использования. В моем проекте MVC у меня есть объект 'Form', и я добавляю поля, которые я хочу редактировать, используя что-то вроде' new EditField (e => e.AddressId) '.Я использую 'MemberExpression' для создания элемента правой формы, но некоторым типам требуется значение по умолчанию. EG 'long' имеет значение по умолчанию 0, а' DateTime' имеет дату по умолчанию. Вместо создания множества операторов If для установки правильного значения по умолчанию для каждого типа, я просто создаю экземпляр, как объяснил Остин, и использую '.ToString()', чтобы получить правильное значение по умолчанию. –

1

Нет, это невозможно. Тип переменной должен быть известен во время компиляции.

Вы можете объявить переменную типа object, она будет способна хранить любой тип данных.

2

GetType оценивается во время выполнения, а декларация не dynamic во время компиляции (это более конкретный вариант, да), поэтому нет. Даже var потребует от вас присвоить значение, которое имеет однозначный тип.

3

объект x = Activator.CreateInstance (Тип) позволит вам создать объект. Можете ли вы много сделать с этим, кроме того, я не уверен.

+1

Это создаст экземпляр этого типа, а не переменную этого типа. – Guffa

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