2012-06-23 44 views
5

¿Alguien me puede decir cómo declarar una función global en C#, similar a lo que hace un Module en VB.net? Necesito llamar a una función que se puede llamar en mi form1, form2 y form3.cómo declarar una función o método global usando C#?


tengo este código:

using System.Data.OleDb; 

namespace XYZ 
{ 
    public static class Module 
    { 
     public static void dbConnection() 
     { 
      OleDbConnection con = new OleDbConnection(); 
      con.ConnectionString = "provider= microsoft.jet.oledb.4.0;data source=..\\dbCooperative.mdb"; 
      con.Open(); 
     } 
    } 
} 

y Form1:

using System.Data.OleDb; 
using XYZ; 

namespace XYZ 
{ 
    public partial class frmReports : Form 
    { 
     public frm1() 
     { 
      InitializeComponent(); 
     } 

     private void frm1_Load(object sender, EventArgs e) 
     { 
      Module.dbConnection(); 
      OleDbCommand cm = new OleDbCommand("SELECT * FROM table", con); 
     } 
    } 
} 

pero tiene un error: "El nombre 'con' no existe en el contexto actual".

+1

No hay funciones globales en C#, pero puede hacer que los métodos sean globalmente accesibles en su aplicación. – kol

+2

Aunque son compatibles con CLR, C# en sí no admite "Funciones globales". Por lo que sé, si quieres llamarlos, tendrás que escribir esa lógica en VB (u otro idioma que los soporte), o modificar la IL compilada por ti mismo. En su caso, las sugerencias para usar una clase estática deberían ser suficientes. –

Respuesta

14

Puede crear una clase estática.

namespace MyNamespace 
{ 
    public static class MyGlobalClass 
    { 
     public static void MyMethod() { ... } 
    } 
} 

A continuación, añadir el espacio de nombres en la sección using de la clase llamada para acceder a ella. De esta manera:

using MyNamespace; 

public class CallingClass 
{ 
    public void CallingMethod() 
    { 
     MyGlobalClass.MyMethod(); 
    } 
} 
+0

+1 Otra opción es usar un Singleton. – kol

1

Puede crear una clase estática (incluso encerrarlo en su propio espacio de nombres a fin de no contaminar el espacio de nombres principal del proyecto), a continuación, llamar a él desde cualquier lugar:

namespace SomeNamespace 
{ 
    public static class SomeClass 
    { 
     public static string SomeMethod() 
     { 
      ... 
     } 
    } 
} 

Entonces, en su código, se le puede llamar usando:

string x = SomeNamespace.SomeClass.SomeMethod(); 

O bien, puede configurar un using en la parte superior del código y simplemente hacer referencia a ella sin el espacio de nombres:

using SomeNamespace; 
... 
string x = SomeClass.SomeMethod(); 
+3

Creo que es muy engañoso llamar a un espacio de nombres GlobalNamespace o llamar a una clase GlobalClass ... – kol

+0

@kol tal vez, pero creo que Saluce estaba tratando de mostrar el anonimizador explícitamente cómo la clase se relaciona con su pregunta. –

9

Si está utilizando C# 6.0 o posterior, puede usar using static.

Por ejemplo,

using static ConsoleApplication.Developer; 

namespace ConsoleApplication 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      // Global static function, static shorthand really 
      DeveloperIsBorn(firstName: "Foo", lastname: "Bar") 
       .MakesAwesomeApp() 
       .Retires(); 
     } 
    } 
} 

namespace ConsoleApplication 
{ 
    class Developer 
    { 
     public static Developer DeveloperIsBorn(string firstName, string lastname) 
     { 
      return new Developer(); 
     } 

     public Developer MakesAwesomeApp() 
     { 
      return this; 
     } 
     public Developer InsertsRecordsIntoDatabaseForLiving() 
     { 
      return this; 
     } 

     public void Retires() 
     { 
      // Not really 
     }   
    } 
} 

Un ejemplo más:

using static System.Console; 

namespace ConsoleApplication7 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      WriteLine("test"); 
     } 
    } 
} 
+2

No sabía acerca de la palabra clave "using static", gracias por mencionarlo – Simone

1

@kol es correcto, no hay ninguna función globales en C#. Echa un vistazo a esta publicación MSDN post. Me gustaría utilizar capas (Me cambió el nombre a su clase "módulo" a "TransactionsModule") y que se vería así:

using System; 
using System.Collections.Generic; 
using System.Data.OleDb; 

namespace XYZ 
{ 
    public class TransactionsModule 
    { 
     public List<Person> GetPersons(string query, string connectionString) 
     { 
      List<Person> dbItems = new List<Person>(); 

      OleDbConnection conn = new OleDbConnection(connectionString); 

      try 
      { 
       conn.Open(); 
       var cmd = new OleDbCommand(query, conn); 
       cmd.CommandText = query; 

       using (OleDbDataReader reader = cmd.ExecuteReader()) 
       { 
        Person objPerson = new Person(); 

        //These are the columns returned 
        objPerson.Name = Convert.ToString(myReader["Name"]); 
        objPerson.Age = Convert.ToInt32(myReader["Age"]); 

        dbItems.Add(objPerson); 
       } 
      } 
      catch(OleDbException ex) 
      { 
       throw ex; 
      } 
      finally 
      { 
       conn.Close(); 
      } 
      return dbItems;   
     } 


    } 

    //This class should be in another Layer, but I placed it here since It's a quick Example 
    public class Person 
    { 
     public string Name { get; set; } 
     public int Age { get; set; } 
    } 
} 

Toda la lógica se abstrae a la clase TransactionsModule, a continuación, sólo tiene que llamar al método: GetPersons. Eche un vistazo:

using System; 
using System.Collections.Generic; 
using XYZ.TransactionsModule; 

namespace XYZ 
{ 
    public partial class frmReports : Form 
    {  
     public frm1() 
     { 
      InitializeComponent(); 
      protected TransactionsModule moduleTran; 
     } 

     private void frm1_Load(object sender, EventArgs e) 
     { 
      //We initialize the Data Access Layer class 
      moduleTran = new TransactionsModule(); 

      //This ConnectionString should be in your app.config 
      string conString = "provider= microsoft.jet.oledb.4.0;data source=..\\dbCooperative.mdb"; 
      string sqlQuery = "SELECT * FROM table"; 

      List<Person> ItStaff = moduleTran.GetPersons(sqlQuery, conString); 
     } 
    } 
} 
Cuestiones relacionadas