Как проверить тип динамического типа данных во время выполнения?
На моем веб-сайте ASP.NET у меня есть метод, который возвращает значение типа dynamic
. Этот метод, в зависимости от определенных критериев и результатов, будет либо возвращать логическое значение, либо SortedList.
Слишком много кода для вставки, но, например:
public dynamic ReturnThis(dynamic value)
{
if(someConditionIsMet)
{
value = true;
}
else
{
value = new List<String>().Add(new Person() { Name = "Travis" });
}
return value;
}
Моя проблема заключается в том, что я хотел бы определить значение datatype
после вызова этого метода, прежде чем действовать или читать его данные. Но я не уверен, как проверить тип dynamic value
. Как я могу это сделать?
Ответы
Ответ 1
Просто прочитайте это на другом SO-вопросе... надеюсь, он сделает трюк для вас:
Type unknown = ((ObjectHandle)tmp).Unwrap().GetType();
Прочитайте и увеличьте этот вопрос для получения дополнительной информации:
получить Тип для объявленного динамического объекта
Ответ 2
Вы можете просто использовать GetType()
. Например:
dynamic returnedValue = ReturnThis(value);
var returnType = returnedValue.GetType();
Вот еще информация о GetType()
Ответ 3
Оба решения работают на меня. В документации, связанной с Smeegs, было указано ключевое слово is
. И я придумал несколько более читаемое решение:
if(value is Boolean) { }
и if(value is List<Person>) { }
Рабочее испытание:
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication3348
{
class Program
{
class Person
{
string Name = "";
}
static void Main(string[] args)
{
Console.WriteLine("Assigning List to value");
dynamic value = new List<Person>();
if (value is List<Person>)
{
Console.WriteLine("value is a list");
}
value = false;
Console.WriteLine("Assigning bool to value");
if (value is Boolean)
{
Console.WriteLine("value is bool");
}
Console.Read();
}
}
}
Ответ 4
Для динамического типа:
dynamic dynVar;
Type type;
Только объявленная, неинициализированная переменная dynamic
dynVar
вызовет исключение из
Введите Microsoft.CSharp.RuntimeBinder.RuntimeBinderException, когда вы выполняете привязку времени выполнения по нулевой ссылке при выполнении Type-Reflection через dynVar.GetType()
.
-
Как указано в "Трой Карлсон", можно использовать довольно медленный метод через удаленный MarshalByRefObject:
Type type = ((ObjectHandle)dynVar).Unwrap().GetType();
// > type...is null
-
Но достаточно простой проверки нуля, как и для любого другого типа:
type = dynVar == null ? null : dynVar.GetType();
-
или...
type = dynVar?.GetType();