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

时间:2014-06-12 17:26:51

标签: c# extension-methods

我有一个关于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

非常感谢!

4 个答案:

答案 0 :(得分:10)

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

答案 1 :(得分:0)

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

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

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

答案 2 :(得分:0)

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

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

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

示例:

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

答案 3 :(得分:0)

好吧,我只是偶然做到了这一点(我很惊讶,我用谷歌搜索了,这导致我来到这里):

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<bool>转换为bool

bool hasData = vHasData();