У меня есть метод с параметром out, который пытается сделать преобразование типа. В основном:
public void GetParameterValue(out object destination)
{
object paramVal = "I want to return this. could be any type, not just string.";
destination = null; // default out param to null
destination = Convert.ChangeType(paramVal, destination.GetType());
}
Проблема в том, что обычно кто-то называл бы это:
string output;
GetParameterValue(output);
Это не удастся из-за:
destination.GetType()
destination имеет значение null, поэтому мы не можем называть его .GetType()
. Мы также не можем позвонить:
typeof(destination)
потому что назначение - это имя переменной, а не имя типа.
Итак, есть ли способ получить тип объекта, который имеет значение null? Я бы подумал, что должен был бы быть способ узнать, какой тип хранилища находится без того, что ему что-то назначено.
Чтобы дать немного больше информации, я пытаюсь сделать метод утилиты, который будет захватывать выходные параметры хранимой процедуры Oracle. Проблема в том, что DbParameter.Value
имеет объект типа.
Что было бы идеальным для разработчиков, чтобы сделать что-то вроде:
string val = GetParameterValue("parameterName");
Примечательно то, что литейного типа нет. На практике вы не знаете lparam "equals", поэтому я пошел с:
string val;
GetParameterValue("parameterName", out val);
И фигурируя внутри метода, я бы знал тип назначения выходной переменной. Думаю, это было плохое предположение. В качестве альтернативы я также написал метод:
public T GetParameterValue<T>(string paramName)
Таким образом, разработчики могут:
string val = GetParameterValue<string>("parameterName");
Я обнаруживаю, что явное "строковое" объявление повторяется, тем более, что на практике место назначения, возможно, может иметь свойство объекта и тип данных оракула (подумайте об ORM):
MyObj.SomeProp = GetParameterValue<MyObj.SomeProp.GetType()>("parameterName");
Но опять же, если MyObj.SomeProp имеет значение null, вызов .GetType()
завершается с ошибкой. VM должна знать тип MyObj.SomeProp
, даже если его нулевой, правильно? или иначе, как он поймает исключения исключения?
Чтобы частично решить мою собственную проблему, я могу сделать:
MyObj.SomeProp = GetParameterValue<typeof(MyObj).GetField("SomeProp").GetType()>("parameterName");
Вся идея заключалась в том, чтобы не нужно явно использовать Type в нескольких местах, поэтому, если тип данных изменяется, его нужно изменить только в целевом объекте (MyObj.SomeProp
) и в БД. Должен быть лучший способ...