C#如何创建没有括号的扩展名

C#如何创建没有括号的扩展名,c#,extension-methods,C#,Extension Methods,我有一个关于C#的奇怪问题 我有一个静态类将方法存储为扩展。 然后,我有以下扩展: public static bool fwHasData(this DataTable table) { return (table == null || table.Rows.Count == 0) ? true : false; } 我的问题是:当我尝试在代码中使用扩展时,是否存在某种避免使用括号的方法 用法: bool vHasData = MyDataTable.fwHasData(); //

我有一个关于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#中,尝试调用没有括号的方法没有意义

您声明了一个扩展方法,因此当然需要这样调用它(使用括号)


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

这在C#中是不可能的。它需要某种形式的“扩展属性”语法,这在C#中是不可用的,但是在今天的C#语言中不存在,在即将发布的C#6建议中也不存在。

正如其他人所建议的,限制是您不能拥有扩展属性

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

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

例如:

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

好吧,我只是不小心做了这个(我很惊讶,我用谷歌搜索了一下,这让我来到了这里):


您确实意识到,对于C#中的方法,括号总是必需的。撇开不谈,这是关于扩展方法的,而不是关于visual studio扩展(它们完全不同)。答案:你可以切换到VB,在VB中,括号对于无参数函数是可选的。许多人认为扩展属性是有意义的,但开发和测试的成本并不值得(相对于其他可能更有意义的功能而言)。@DStanley,很抱歉造成混淆。我并不是说扩展属性没有意义(事实上我同意它们有意义)。我曾指出,您必须始终使用括号调用方法,不这样做没有任何意义。我将尝试编辑并澄清这一点。是的,这是一个快速解决方案,但我需要将所有DataTable声明为DataTableEx…我不想这样做。您可以使用
Func
而不是
bool
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;
bool hasData = vHasData();