Auto-Implemented properties
Jacob Carlborg
doob at me.com
Sun Jan 6 03:32:39 PST 2013
On 2013-01-05 23:40, michaelc37 wrote:
> i was trying to make a D template to mimic auto-implemented
> properties in c#.
>
> I think i got it to work but when i tried to give the template a
> more meaning full name like AutoImplementedProperty i get a
> compile error "a.title is not an lvalue".
> Is this a bug?
> Is there a more suitable way of doing this?
>
> c# e.g:
> class Bar
> {
> public string Title { get; set; }
> }
>
> my attempt:
> class Bar
> {
> alias autoproperty!(string, "get", "set") title
> }
>
> template autoproperty(T, args...)
> {
> import std.typetuple;
> @property
> {
> private T _name;
> static if (args.length)
> {
> static if (staticIndexOf!("get", args) > -1)
> {
> public T autoproperty()
> {
> return _name;
> }
> }
>
> static if (staticIndexOf!("set", args) > -1)
> {
> public void autoproperty(T value)
> {
> _name = value;
> }
> }
>
> }
> }
> }
>
> void main(string[] args)
> {
> Bar a = new Bar();
> a.title = "asf";
> writefln(a.title);
>
> return;
> }
This won't work like you think it will. All instances of "Bar" will
share the same "_name" variable.
You need to use a mixin. This pass:
void main ()
{
Bar a = new Bar();
a.title = "asf";
Bar b = new Bar;
assert(b.title == a.title);
}
--
/Jacob Carlborg
More information about the Digitalmars-d-learn
mailing list