public bool CanCastTo(Type castType, Object o)
{
bool fCastOK = false;
// The identity should be non-null
BCLDebug.Assert(null != IdentityObject,"null != IdentityObject");
Message.DebugOut("CheckCast for identity " + IdentityObject.GetType());
if ((castType == s_typeofObject) ||
(castType == s_typeofMarshalByRefObject))
{
return true;
}
// Get the objref of the proxy
ObjRef oRef = IdentityObject.ObjectRef;
// If the object ref is non-null then check against the type info
// stored in the it
if (null != oRef)
{
Object oTP = GetTransparentProxy();
// Check that there is a matching type in the server object
// hierarchy represented in the objref
Message.DebugOut("Calling CanCastTo for type " + castType);
IRemotingTypeInfo typeInfo = oRef.TypeInfo;
if(null != typeInfo)
{
fCastOK = typeInfo.CanCastTo(castType, oTP);
if (!fCastOK && typeInfo.GetType()==typeof(TypeInfo) && oRef.IsWellKnown() )
{
fCastOK = CanCastToWK(castType);
}
}
else
{
if (oRef.IsObjRefLite())
{
// we should do a dynamic cast across the network
fCastOK = MarshalByRefObject.CanCastToXmlTypeHelper(castType, (MarshalByRefObject)o);
}
}
}
// This is a well known object which does not have a backing ObjRef
else
{
fCastOK = CanCastToWK(castType);
}
return fCastOK;
}