public bool Getproperty(AbstractTerm obj, AbstractTerm method, AbstractTerm returnObject)
{
if (obj.IsConstant)
{
// invoke a static get property
Assembly asm = GetRequiredAssembly(obj.Data() as string, runtime); ;
Type type = asm.GetType(obj.Data() as string);
if (type == null)
{
return false;
}
if (type.GetProperty(method.Data() as string) == null)
{
return false;
}
object res = type.InvokeMember(method.Data() as string, BindingFlags.GetProperty | BindingFlags.Static | BindingFlags.Public, null, null, null);
switch (res.GetType().ToString())
{
case "System.String":
AbstractTerm rC = new ConstantTerm(res.ToString());
if (!returnObject.Unify(rC))
{
return false;
}
break;
case "System.Char":
case "System.Int32":
case "System.Boolean":
AbstractTerm returnConstant = new ConstantTerm(res.ToString());
if (!returnObject.Unify(returnConstant))
{
return false;
}
break;
default:
returnObject.Unify(new ObjectTerm(res));
break;
}
}
else
{
if (obj.Data().GetType().GetProperty(method.Data() as string) == null)
{
return false;
}
// invoke an instance get property
object res = obj.Data().GetType().InvokeMember(method.Data() as string, BindingFlags.Default | BindingFlags.ExactBinding | BindingFlags.GetProperty, null, obj.Data(), null);
switch (res.GetType().ToString())
{
case "System.Char":
case "System.String":
case "System.Int32":
case "System.Boolean":
returnObject.Unify(new ConstantTerm(res.ToString()));
break;
default:
returnObject.Unify(new ObjectTerm(res));
break;
}
}
return true;
}