我有以下内容:
interface IViewable {}
class Node {}
class DecisionNode : Node, IViewable {}
在应用程序的一个部分中,我有以下方法,我传递一个DecisionNode实例:
void handleNode (Node node)
{
// ...
var viewable = node as IViewable;
// ...
}
问题是,这似乎没有检查node
的动态/运行时类型是否实际上是IViewable
的子类。它正确地排除了这适用于静态类型(Node
),但这不是我想要检查的。如果我尝试投射或使用is
,我会得到相同的结果。
我被建议使用GetType ().IsAssignableFrom()
来解决这个问题,但我正在使用的平台(Xamarin)不允许这样做。
有没有其他方法可以检查我的对象的动态类型是否可以被视为给定类型的实例?
答案 0 :(得分:4)
as
进行类型检查;如果检查失败,它只会返回null
,您可以使用if
进行测试:
if(viewable != null) {
...
} else {
...
}
回复:
的实例
node
不能被视为IViewable
这是正确的;但是,viewable
可以是;只需针对IViewable
运行与viewable
相关的代码。
如果您想断言,此转换应始终有效;刚演员:
var viewable = (IViewable)node;
例如,以下输出:
DecisionNode: True
Node: False
代码:
class Program
{
static void Main()
{
var prog = new Program();
prog.handleNode(new DecisionNode());
prog.handleNode(new Node());
}
void handleNode(Node node)
{
var viewable = node as IViewable;
System.Console.WriteLine("{0}: {1}",
node.GetType().Name,
viewable != null);
}
}
interface IViewable { }
class Node { }
class DecisionNode : Node, IViewable { }
如果你无法让它发挥作用,请考虑:
// play hunt the interface
if(viewable == null) {
foreach(Type iType in node.GetType().GetInterfaces()) {
if(iType.Name == "IViewable") {
Console.WriteLine("{0} vs {1}",
iType.AssemblyQualifiedName,
typeof(IViewable).AssemblyQualifiedName);
}
}
}
答案 1 :(得分:3)
as
会进行类型检查。
as
关键字会执行某种“软”操作。转换,尝试,如果失败,它将恢复为null
:
as运算符就像一个强制转换操作。但是,如果转换不可能,则返回null而不是引发异常。
请检查null
,您会知道viewable
是null
是否为var viewable = node as IViewable;
if (viewable != null)
{
// go ahead!
}
:
is
或使用if (node is IViewable)
{
var viewable = (IViewable)node; // this is safe now
// go ahead!
}
检查:
{{1}}