2015-11-16 2 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 Я создал форму жерех, где это на стороне сервера код выглядеть следующим образом:Extension не найден в моем классе .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

Чтобы ответить на вашу неопределенность - да, вы можете использовать '[Расширение]' для объявления метода расширения, хотя это не идиоматично. Тем не менее, он все равно должен быть статическим. –

1

Метод расширения должен быть статическим, а методы расширения должны быть объявлены в негенерированном, не вложенном, статическом классе. Ваши данные:

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

oops. Ответ уже дан. :) – StepUp

0

Попробуйте назвать это;

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

Поскольку ваш метод как LogError<T> вы можете MEED определить T здесь.

EDIT: В моем коде я не использовал [System.Runtime.CompilerServices.Extension()].

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

+0

это не сработало sing ex не распознает мою функцию – Sora

+0

Я попробовал код в своем тестовом решении. он работает, как указано выше. – Irshad

+0

Комментарий '[System.Runtime.CompilerServices.Extension()]' и попробуйте. В нем говорится: «Не используйте« System.Runtime.CompilerServices.ExtensionAttribute ». Вместо этого используйте ключевое слово this. – Irshad

Смежные вопросы