2015-11-16 30 views
0
namespace MyExtensions 
{ 
public static class MyExtensions 
{ 

    [System.Runtime.CompilerServices.Extension()] 
    public static bool LogError<T>(this T exp, string errorType = "",string extramessage = "") where T : System.Exception 
    { 
     if (!exp.Message.ToString().ToLower().Contains("thread was being aborted")) 
     { 
      string strDate = DateTime.Now.Date.ToString("yyyy-MM"); 
      string FilePath = (HttpContext.Current.Server.MapPath(ConfigurationManager.AppSettings["Errors"]) + "LogError-" + strDate + ".txt"); 
      FileInfo myFile = new FileInfo(FilePath); 
      StreamWriter sWriter = new StreamWriter(FilePath, true); 
      sWriter.WriteLine(("#------------" + DateTime.Now.ToString("dd-MM-yyyy hh:mm:ss tt") + "------------#")); 
      sWriter.WriteLine(("Source: " + exp.Source)); 
      sWriter.WriteLine(("Method: " + exp.TargetSite.Name)); 
      sWriter.WriteLine(("Message: " + exp.Message)); 
      if (exp.InnerException != null) 
      { 
       sWriter.WriteLine(("Inner Exception: " + exp.InnerException.Message)); 
      } 
      sWriter.WriteLine(("StackTrace: " + exp.StackTrace)); 

      if (!string.IsNullOrEmpty(extramessage)) 
      { 
       sWriter.WriteLine(" -- Extra Message: -- "); 
       sWriter.WriteLine(extramessage); 

      } 
      sWriter.WriteLine("#------------------------------------------------#"); 
      sWriter.WriteLine(); 
      sWriter.WriteLine(); 
      sWriter.Close(); 
     } 
     return true; 
    } 

} 

} 

我有這樣的類,它包含一個擴展方法稱爲LogError 我創建了一個ASP的形式,然後是服務器端的代碼如下所示:擴展是不是在我的.cs類中找到

using MyExtensions 
    public partial class Form : BasePage 
    { 
     public void GetEmpleye() 
     { 
     try{} 
     catch(Exception ex) 
     { ex.LogError(); } 

     } 
    } 

ex.LogError();這線是給我一個錯誤說:

System.Extension不包含LogError

定義
+0

你'MyExtensions'類被打破入手 - 這是一個靜態類,但是你已經把在構造函數中。這是不允許的,所以你應該在那裏得到一個錯誤。接下來,你的'LogError'方法是一個實例方法,最後它沒有'this'作爲第一個參數的修飾符。 –

+0

擴展方法必須是靜態的,第一個參數應該是「this T exp」。 – Silvermind

+0

請檢查我的編輯 – Sora

回答

4

您的方法不是擴展方法。它必須是static和它在第一個參數的前需要this

public static bool LogError<T>(this T exp, string errorType = "", string extramessage = "") where T : System.Exception 

ExtensionAttribute在VB.NET被使用。我不確定您是否可以使用它在C#中創建擴展方法。但即使你需要制定方法static

+0

該方法也需要是靜態的 - 靜態類不應該有一個實例構造函數... –

+0

@JonSkeet在您發佈該評論時編輯我的答案。現在修復。 – MarcinJuraszek

+0

要回答你的不確定性 - 是的,你可以使用'[Extension]'聲明一個擴展方法,儘管它不是慣用的。它仍然需要是一個靜態方法。 –

1

擴展方法應該是靜態的,擴展方法應該在非泛型的非嵌套靜態類中聲明。您的列表:

public static bool LogError<T>(this T exp, string errorType = "", string extramessage = "") where T : System.Exception 
{ } 
+0

哎呀。答案已經給出。 :) – StepUp

0

試試這樣的電話;

try{} 
     catch(Exception ex) 
     { ex.LogError<Exception>(); } 

因爲你的方法是像LogError<T>你可以MEED這裏定義T

編輯:在我的代碼中,我沒有使用[System.Runtime.CompilerServices.Extension()]

https://msdn.microsoft.com/en-us/library/bb384079.aspx

+0

它沒有工作唱前ex不承認我的功能 – Sora

+0

我試過你在我的測試解決方案中的代碼。它的工作原理如上 – Irshad

+0

註釋'[System.Runtime.CompilerServices.Extension()]'並嘗試。它說「不要使用'System.Runtime.CompilerServices.ExtensionAttribute',而是使用'this'關鍵字。」 – Irshad