如何隐藏program.cs的plumbings

时间:2010-09-30 05:37:49

标签: c#

在典型的winform program.cs中包含入口点:

     static void Main(string[] args) {

        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        // the code goes on

我想创建自己的框架,隐藏与应用程序域无关的所有内容的管道,所以我希望能够在另一个名称空间中创建基类类似

namespace MyFramework
{
    public partial class Program
    {



        [STAThread]
        static void Main(string[] args)
        {

            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);


            // the code goes on

然后在我的应用程序命名空间program.cs继承上面的那个,以便我可以摆脱Application.EnableVisualStyles并只写这样的东西

        static void Main(string[] args): base()
        {
           //only app domain code

如果从两个类中删除静态attrib但是我无法从主入口方法中删除静态,那么我可以从基类继承,所以我无法真正完成。

我不想使用后面的代码隐藏铅笔,因为我需要将其移植到其他没有代码的语言。

有没有办法用OOP实现这个简单合法的目标(继承与否,静态与否),而不使用一些大的外部框架?

例如,有没有办法可以将主入口点委托给框架命名空间中的另一个类?

3 个答案:

答案 0 :(得分:1)

您的入口点必须为static

答案 1 :(得分:1)

执行此操作的最佳方法是使您的Program类成为非静态类,该类派生自另一个类(将完成您所需的所有工作的类)。您可以在基类中声明static方法,并在Application.EnableVisualStyles();之前调用该方法。

相同的代码将是这样的:

public class Program : MyBaseClass
{
    [STAThread]
    static void Main()
    {
        MethodToDoAllTheHardWork();

        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new Form1());
    }
}

public class MyBaseClass
{
    public static void MethodToDoAllTheHardWork()
    {
    }
}

static中声明MyBaseClass方法的原因是因为Main方法必须是static方法,并且您只能调用相同的静态成员或基类。

答案 2 :(得分:1)

入口点方法需要是静态的,因此使用继承(如您所知)将无法工作,但可以通过多种方式执行您想要执行的操作。例如,

namespace MyFramework
{
    public static class AppStarter
    {

        static EventHandler AppStarting;

        [STAThread]
        static void Run(string[] args)
        {

            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);


            // the code goes on

            if (null != AppStarting)
            {
               AppStarting(null, EventArgs.Empty);
            }

现在,您可以使用它

 public partial class Program
 {
        [STAThread]
        static void Main(string[] args)
        {

            AppStarter.AppStarting += new EventHandler(MyStartupCode);
            AppStarter.Run(args);

另一种基于继承的变体将是

namespace MyFramework
{
    public abstract class Application
    {

        protected abstract void OnBeforeInit();
        protected abstract void OnAfterInit();

        protected void Run(string[] args)
        {
            OnBeforeInit();

            // Do initialization

            OnAfterInit(); 

            ...
        }

您将按如下方式使用它:

 public class MyApplication: MyFramework.Application
 {
        [STAThread]
        static void Main(string[] args)
        {

            (new MyApplication()).Run(args);