![DropDown image](dropdown.gif)
![DropDownHover image](dropdownHover.gif)
![Collapse image](collapse_all.gif)
![Expand image](expand_all.gif)
![CollapseAll image](collall.gif)
![ExpandAll image](expall.gif)
![Copy image](copycode.gif)
![CopyHover image](copycodeHighlight.gif)
Let's look at IScriptable definition:
/// <summary>
/// Expose dynamic members of an Instance to the script.
/// This require using of DefaultObjectBinder class as default object binder.
/// </summary>
public interface IScriptable
{
/// <summary>
/// Should return object wrapped by IScriptable or this
/// </summary>
[Promote(false)]
object Instance { get; }
/// <summary>
/// Gets a binding to an instance's member (field, property)
/// </summary>
[Promote(false)]
IMemberBinding GetMember(string name, params object[] arguments);
/// <summary>
/// Gets a binding to an instance's method
/// </summary>
[Promote(false)]
IBinding GetMethod(string name, params object[] arguments);
}
Each class implementing this interface has special meaning in S#. Let's assume that variable scriptable associated with an instance implementing IScriptable interface. Then following examples are valid in S#:
a = scriptable.PropertyName;
//The same as following code:
// a = scriptable.GetMember("PropertyName").GetValue();
scriptable.PropertyName = 2;
//The same as following code:
//scriptable.GetMember("PropertyName").SetValue(2);
scriptable.MethodName(1,"test", 3);
//The same as following code:
// scriptable.GetMethod("MethodName").Invoke(currentContext, new object[] {1, "test", 3});