Как написать метод расширения, который возвращает динамический объект? - PullRequest
1 голос
/ 24 декабря 2009

Я думал о том, как Regex.Match.Group хочет быть динамичным:

Regex.Match (...).Groups["Foo"]

хотел бы быть:

Regex.Match (...).Groups.Foo

Я думал о написании метода расширения, который позволил бы:

Regex.Match (...).Groups().Foo

И попытался написать так, но это не разрешено (';' требуется для 'static dynamic')

public static dynamic DynamicGroups Groups(this Match match)
{
    return new DynamicGroups(match.Groups);
}

public class DynamicGroups : DynamicObject
{
    private readonly GroupCollection _groups;

    public DynamicGroups(GroupCollection groups)
    {
        this._groups = groups;
    }
    public override bool TryGetMember(GetMemberBinder binder, out object result)
    {
        Group g = this._groups[binder.Name];

        if (g == null)
        {
            result = null;
            return false;
        }
        else
        {
            result = g;
            return true;
        }
    }
}

Есть ли способ сделать это?

Существует множество других API, которые были написаны до dynamic, которые могли бы быть более понятными при использовании этого способа.

1 Ответ

8 голосов
/ 24 декабря 2009

В вашем коде только одна маленькая ошибка, замените dynamic DynamicGroups на dynamic

public static dynamic Groups(this Match match)
{
    return new DynamicGroups(match.Groups);
}
...