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; |
编辑-看,最终你还是需要用括号将
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中尚不存在的扩展属性一样。无论如何,您并没有像声明属性那样声明它,所以即使它们确实存在,您仍然需要将其作为一个方法来调用。