Auto-Implemented properties
michaelc37
michaelc37 at msn.com
Sun Jan 6 10:16:07 PST 2013
On Sunday, 6 January 2013 at 11:32:40 UTC, Jacob Carlborg wrote:
> 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);
> }
Yea i realized that later, but the only fix i could come up with
required me passing the property name in the template parameters,
so the declaration has changed a bit.
second attempt;
class Bar
{
public mixin autoproperty!(string, "title", "get", "set");
public mixin autoproperty!(string, "description", "get", "set");
}
mixin template autoproperty(T, alias propertyName, args...)
{
import std.typetuple;
mixin("private T _" ~ propertyName ~ ";");
@property
{
static if (args.length)
{
static if (staticIndexOf!("get", args) > -1)
{
mixin("
T " ~ propertyName ~ "()
{
return _" ~ propertyName ~ ";
}");
}
static if (staticIndexOf!("set", args) > -1)
{
mixin("
void " ~ propertyName ~ "(T value)
{
_" ~ propertyName ~ " = value;
}");
}
}
}
}
More information about the Digitalmars-d-learn
mailing list