我有一个关于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
非常感谢!
答案 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();