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

C# How create a extension without parentheses

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

我有一个静态类将方法存储为扩展。那么,我有以下扩展:

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

我的问题是:是否存在避免在代码中使用扩展名时使用括号的方法?

用途:

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

预期用途:

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

谢谢!


这在C中是不可能的。它需要某种形式的"扩展属性"语法,这在C中不可用。它在过去曾被建议过,但在今天的C语言中不存在,在未来的C 6建议中也不存在。


好吧,我只是不小心做了这个(我很惊讶,我在谷歌上搜索了一下,然后就把我带到了这里):

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

使用此扩展方法:

1
2
3
4
5
6
7
public static class ExtendGenericType
{
    public static IEnumerable<T> AsEnumerable<T>(this T entity)
    {
        yield return entity;
    }
}

……瞧,没有括号!所以请试试这个,让我知道:

1
Func<bool> vHasData = MyDataTable.fwHasData;

编辑-看,最终你还是需要用括号将Func转换成bool

1
bool hasData = vHasData();


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

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

然后,您可以使用任意多的属性扩展数据表!

例子:

1
2
3
4
5
6
7
8
9
10
public class DataTableEx : DataTable
    {
        public bool fwHasData
        {
            get
            {
                return (Rows.Count == 0) ? true : false;
            }
        }
    }


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

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

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