【问题标题】:How to write an extension method that returns a dynamic object?如何编写返回动态对象的扩展方法?
【发布时间】:2009-12-23 23:22:50
【问题描述】:

我在想 Regex.Match.Group 如何变得动态:

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

想成为:

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

我想写一个扩展方法来允许:

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

并尝试这样写,但这是不允许的(';'需要'静态动态')

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;
        }
    }
}

有什么方法可以做到这一点?

dynamic 之前编写的许多其他 API 使用这种方式可能更简洁。

【问题讨论】:

  • 这是一个很好的例子,说明为什么动态没有接近我可以控制的任何代码。这样做的唯一结果是您拥有看起来是静态类型但不是静态类型的东西。
  • @erik:一个非常现实的问题。我决定先看看它是否可能,然后再看看我是否喜欢它。我正在考虑调用扩展方法DynamicGroups() 来说明清楚。你怎么看?

标签: c# dynamic .net-4.0 extension-methods c#-4.0


【解决方案1】:

您的代码中只有一个小错误,请将 dynamic DynamicGroups 更改为 dynamic

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

【讨论】:

    猜你喜欢
    • 2013-03-05
    • 2011-07-15
    • 2018-08-19
    • 2018-02-23
    • 1970-01-01
    • 2011-05-31
    • 2018-05-23
    • 1970-01-01
    相关资源
    最近更新 更多