If you were really missing your magic methods, you could create a dynamic base class in C# (provided you are using .NET 4.0+):
public abstract class Model : DynamicObject
{
public virtual object __get(string propertyName)
{
return null;
}
public override bool TryGetMember(GetMemberBinder binder, out object result)
{
if ((result = this.__get(binder.Name)) != null)
return true;
return base.TryGetMember(binder, out result);
}
public virtual void __set(string propertyName, object value)
{
}
public override bool TrySetMember(SetMemberBinder binder, object value)
{
this.__set(binder.Name, value);
return true;
}
}
Create a new type derived from that and instantiate using "dynamic" keyword:
dynamic myObject = new MyModelType();
myObject.X = 42; // calls __set() in Model
Console.WriteLine(myObject.X); // calls __get() in Model
In short you could achieve very similar behavior in C# if you wanted to (see DynamicObject on MSDN).