2011-01-19 15 views
5

Estoy desarrollando una aplicación en ASP.Net 4.0 con C# en la que estoy haciendo el registro y el seguimiento utilizando Enterprise Lib de Microsoft. Mi problema es que casi en cada función, según la guía de mi compañía, donde hay interacción con la base de datos o algunas reglas comerciales críticas, use el rastreo, en este formato.Cómo obtener el nombre del método automáticamente en el fragmento de código en C# 4.0

try 
{ 
_traceLog.clear(); 
_traceLog.AppendLine("XYZ method started: XYZ()"); 

_traceLog.AppendLine("XYZ method completed: XYZ()"); 
} 
catch(Exception ex) 
{ 
_userException.CreateExceptionLog(ex); 
} 
finally 
{ 
_userException.CreateTraceLog(_traceLog.ToString()); 
} 

Así que lo que quiero es convertir como un fragmento de código que detectará automáticamente el método actual, por ejemplo en el caso anterior tenemos XYZ().

Por favor, ayúdame. También dime la forma de agregar esto a intellisense. Ahora mismo puedo crear un archivo .snippet y uso el fragmento de inserción desde el menú contextual.

actualizar

Creo que no me queda claro a ustedes. Déjame hacer más claro. tengo un fragmento de código

<CodeSnippets 
    xmlns="http://schemas.microsoft.com/VisualStudio/2010/CodeSnippet"> 
    <CodeSnippet Format="1.0.0"> 
     <Header> 
      <Title> 
       TL 
      </Title> 
     </Header> 
     <Snippet> 
      <Code Language="CSharp"> 
       <![CDATA[ try 
      { 
       _traceLog.Clear(); 
       _traceLog.AppendLine(""); // here in side the append line i want to get name of method under which i am placing code snippet. 
       _traceLog.AppendLine(""); 
      } 
      catch (Exception ex) 
      { 

       _userExceptionLog.CreateExceptionLog(ex); 
      } 
      finally 
      { 
       _userExceptionLog.CreateTraceLog(_traceLog.ToString()); 
      }]]> 
      </Code> 
     </Snippet> 
    </CodeSnippet> 
</CodeSnippets> 

Por ejemplo, si mi método es

void XYZ() 
{ 
    // when i insert snippet here , the snippet will automatically detect 

que este fragmento va a ser incluida en la función XYZ.

try 
       { 
        _traceLog.Clear(); 
        _traceLog.AppendLine("XYZ started: XYZ()"); 

// aquí en el lado de la línea append quiero obtener el nombre del método en el que estoy poniendo fragmento de código.

   _traceLog.AppendLine("XYZ completed: XYZ()"); 
       } 
       catch (Exception ex) 
       { 

        _userExceptionLog.CreateExceptionLog(ex); 
       } 
       finally 
       { 
        _userExceptionLog.CreateTraceLog(_traceLog.ToString()); 
       } 

} 

¿Esto es posible? o tengo que ingresarlo manualmente o de otra manera?

+1

No sé la respuesta a su pregunta específica, pero ¿ha considerado utilizar [PostSharp] (http://sharpcrafters.com) en su lugar? –

+1

Sugeriría que sugiera que el registro, pero no el manejo (es decir, continúe como si no sucediera), cada excepción es * no * una buena idea. – Richard

+0

Richard tiene razón. Estás 'tragando' excepciones, lo cual es una muy mala práctica. Un mejor enfoque es no iniciar sesión en ese nivel y dejar que las excepciones salgan a relucir, y registrarlas en el nivel raíz de la aplicación (por ejemplo, en el evento 'Application_Error' del archivo.asax global de nosotros ASP.NET Aplicación web). – Steven

Respuesta

5

Yo uso este:

try 
{ 

} 
catch (Exception ex) 
{ 
    My.API.ErrorHandler.Handler.HandleError(ex, 
     System.Reflection.MethodBase.GetCurrentMethod().Name, 
     System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.FullName); 
} 

Aquí está el código para el fragmento:

<?xml version="1.0" encoding="utf-8"?> 
<CodeSnippets xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet"> 
    <CodeSnippet Format="1.0.0"> 
    <Header> 
     <Title>Try Catch</Title> 
     <Shortcut>try</Shortcut> 
     <Description>Places a try catch block with My API error handling</Description> 
     <Author>Nathan Freeman-Smith</Author> 
    </Header> 
    <Snippet> 
     <Code Language="csharp"><![CDATA[   try 
      { 

      } 
      catch (Exception ex) 
      { 
       My.API.ErrorHandler.Handler.HandleError(ex, System.Reflection.MethodBase.GetCurrentMethod().Name, System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.FullName); 
      }]]></Code> 
    </Snippet> 
    </CodeSnippet> 
</CodeSnippets> 

Nota del etiqueta de acceso directo con "tratar" dentro de ella.
significa que puedo utilizar el fragmento escribiendo tratar en estudio visual insertar el fragmento, o, marcando pieza de código y lo rodean con este snippt utilizando Ctrl + k, Ctrl + S (Shourtcut teclado deafult)

8

MethodInfo.GetCurrentMethod().Name le dará el nombre del método que se está ejecutando actualmente. Advertencia: los métodos anónimos te darán basura como nombre.

+0

thax Darin. Necesito una cosa más, cualquier otro enlace o tutorial sobre los fragmentos de código, aparte de MSDN uno. –

+0

"basura": sigue siendo único y puede usarlo para obtener el tipo propietario. – Gusdor

Cuestiones relacionadas