2014-06-12 38 views
3

我有一個奇怪的關於C#的問題。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 

非常感謝!

+3

你一定要明白,那個括號對於C#中的方法總是必需的? –

+0

快速一邊,這是關於擴展*方法*不Visual-studio擴展(這是完全不同的)。 – BradleyDotNET

+0

http://stackoverflow.com/questions/619033/does-c-sharp-have-extension-properties回答此問題 – TGH

回答

10

這在C#中是不可能的。它需要某種形式的「擴展屬性」語法,這在C#中是不可用的。 It has been suggested in the past,但今天並不存在於C#語言中,也不存在於即將出現的C#6建議中。

+0

你可以使用'Func '而不是'bool' – Heliac

0

不,這是不可能的。試圖調用沒有括號的方法在C#中沒有意義。

你宣佈了一個擴展方法所以當然你需要調用它(使用圓括號)。

您正在訪問它,好像它是一個擴展屬性它們還不存在於C#中。無論如何,你沒有把它聲明爲一個屬性,所以即使它們確實存在,你仍然需要將它稱爲一種方法。

+0

許多人會認爲擴展屬性_do_是有意義的,但是開發和測試的代價並不值得這個價值(相對於其他可能更有意義的特性。 –

+0

@DStanley,對於混淆我很抱歉,我並不是說擴展屬性沒有意義(事實上我同意他們這樣做),我指出你總是需要用括號來調用方法,而不這樣做沒有任何意義,我會嘗試編輯和澄清 – BradleyDotNET

0

正如其他人所建議的,限制是你不能有一個擴展屬性!

但是,爲了達到你想要的。您可以創建一個從DataTable派生的類(DataTable類不是密封的),並在您的所有代碼中使用此派生版本。

然後,您可以使用盡可能多的屬性擴展DataTable!

例子:

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

是的,這是一個快速修復,但我需要將所有DataTable聲明爲DataTableEx ...我不想這樣做。 – MiBol

0

好吧,我只是不小心這樣做(我很驚訝,我用Google搜索它,這導致我在這裏):

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();