C# - 如果属性是Type或Object实例,则在运行时确定?

时间:2010-10-01 17:09:02

标签: reflection types runtime instance

我想确定是否将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 个答案:

答案 0 :(得分:1)

由于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;

巧合的是,这是采用的方法here

答案 1 :(得分:1)

你没有ToString()它;你应该能够通过GetType()访问它的名字(这几乎是一样的)。无论哪种方式,因为它是一个私有类,并且无法从开发人员代码访问,我认为如果你需要验证它是否是一个特定的RuntimeType,你就会被一个“魔术字符串”所困扰。并非所有“最佳解决方案”都如我们所希望的那样优雅。

如果您获得的所有Type参数实际上都是RuntimeType对象,则可以按照另一个答案中的建议查找基类。但是,如果你可以收到一个不是RuntimeType的Type,你会得到一些“误报”。