【问题标题】:C# How create a extension without parenthesesC#如何创建不带括号的扩展
【发布时间】:2014-08-03 03:13:46
【问题描述】:

我有一个关于 C# 的奇怪问题。

我有一个静态类来将方法存储为扩展。 然后,我有以下扩展名:

public static bool fwHasData(this DataTable table)
{
    return (table == null || table.Rows.Count == 0) ? true : false;
}

我的问题是:当我尝试在我的代码中使用扩展时,是否有某种方法可以避免使用括号?

用法:

bool vHasData = MyDataTable.fwHasData(); // Works fine!

预期用途:

bool vHasData = MyDataTable.fwHasData; // Removing the parentheses

非常感谢!

【问题讨论】:

  • 您确实意识到,C# 中的方法总是需要括号?
  • 别说,这是关于扩展方法而不是visual-studio扩展(它们是完全不同的)。
  • 您可以切换到 VB,其中括号对于无参数函数是可选的。

标签: c# extension-methods


【解决方案1】:

不,这是不可能的。尝试调用不带括号的方法在 C# 中没有意义。

你声明了一个扩展方法,所以你当然需要这样调用它(使用括号)。

您正在访问它,就好像它是 C# 中尚不存在的扩展 property。无论如何,您没有将它声明为属性,因此即使它们确实存在,您仍然需要将其作为方法调用。

【讨论】:

  • 许多人会认为扩展属性确实有意义,但开发和测试的成本不值得(相对于其他可能使更多 感觉。
  • @DStanley,很抱歉造成混乱。我并不是说扩展属性没有意义(事实上我同意他们这样做)。我指出你总是必须用括号调用方法,不这样做没有任何意义。我将尝试编辑和澄清这一点。
【解决方案2】:

这在 C# 中是不可能的。它需要某种形式的“扩展属性”语法,这在 C# 中不可用。 It has been suggested in the past,但现在不存在于 C# 语言中,也不存在于即将发布的 C# 6 建议中。

【讨论】:

  • 你可以用Func<bool>代替bool
【解决方案3】:

根据其他人的建议,限制是您不能拥有扩展属性!

但是,为了实现你想要的。您可以创建一个派生自 DataTable 的类(DataTable 类未密封)并在所有代码中使用此派生版本。

然后,您可以使用任意数量的属性扩展 DataTable!

例子:

public class DataTableEx : DataTable
    {
        public bool fwHasData
        {
            get
            {
                return (Rows.Count == 0) ? true : false;
            }
        }
    }

【讨论】:

  • 是的,这是一个快速修复,但我需要将所有 DataTable 声明为 DataTableEx...我不想这样做。
【解决方案4】:

好吧,我只是不小心做了这个(我很惊讶,我用谷歌搜索了它,结果把我带到了这里):

Func<IEnumerable<IPlanHeader>> test = header.AsEnumerable;

使用此扩展方法:

public static class ExtendGenericType
{
    public static IEnumerable<T> AsEnumerable<T>(this T entity)
    {
        yield return entity;
    }
}

...你瞧,没有括号!所以请试试这个,然后告诉我:

Func<bool> vHasData = MyDataTable.fwHasData;

编辑 - 看,最终您仍然需要在某些时候使用括号将 Func&lt;bool&gt; 转换为 bool

bool hasData = vHasData();

【讨论】:

    猜你喜欢
    • 2020-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-26
    • 1970-01-01
    • 2021-09-01
    相关资源
    最近更新 更多