Определить во время выполнения, если свойство является экземпляром типа или объекта? - PullRequest
3 голосов
/ 01 октября 2010

Я хочу определить, назначен ли MyBindingSource.DataSource на конструкторский набор Type или ему назначен экземпляр объекта.Это мое текущее (довольно уродливое) решение:

Type sourceT = MyBindingSource.DataSource.GetType();
if( sourceT == null || sourceT.ToString().Equals("System.RuntimeType") ) {
     return null;
}
return (ExpectedObjType) result;

System.RuntimeType является приватным и недоступным, поэтому я не могу сделать это:

Type sourceT = MyBindingSource.DataSource.GetType();
if ( object.ReferenceEquals(sourceT, typeof(System.RuntimeType)) ) {
     return null;
}
return (ExpectedObjType) result;

Я был простоинтересно, существует ли лучшее решение?Особенно тот, который не использует имя Type.

Ответы [ 2 ]

1 голос
/ 01 октября 2010

Вам не нужно ToString () это; вы должны иметь возможность доступа к его имени через GetType () (что в значительной степени одно и то же). В любом случае, поскольку это закрытый класс и недоступен из кода разработчика, я думаю, что вы застряли с «волшебной строкой», если вам нужно убедиться, что это именно RuntimeType. Не все «лучшие решения» так элегантны, как хотелось бы.

Если все параметры Type, которые вы получите, на самом деле являются объектами RuntimeType, вы можете искать базовый класс, как было предложено в другом ответе. Однако, если вы можете получить тип, который не является типом RuntimeType, вы получите «ложные срабатывания».

1 голос
/ 01 октября 2010

Поскольку System.RuntimeType является производным от System.Type, вы должны быть в состоянии сделать следующее:

object result = MyBindingSource.DataSource;
if (typeof(Type).IsAssignableFrom(result.GetType()))
{
    return null;
}
return (ExpectedObjType)result;

или даже более кратко:

object result = MyBindingSource.DataSource;
if (result is Type)
{
    return null;
}
return (ExpectedObjType)result;

По совпадению этот подход принят здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...