惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

博客园 - 司徒正美
T
The Blog of Author Tim Ferriss
F
Fortinet All Blogs
Martin Fowler
Martin Fowler
罗磊的独立博客
The GitHub Blog
The GitHub Blog
L
LangChain Blog
A
About on SuperTechFans
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
D
DataBreaches.Net
宝玉的分享
宝玉的分享
U
Unit 42
阮一峰的网络日志
阮一峰的网络日志
Last Week in AI
Last Week in AI
N
Netflix TechBlog - Medium
The Cloudflare Blog
Microsoft Azure Blog
Microsoft Azure Blog
H
Help Net Security
美团技术团队
大猫的无限游戏
大猫的无限游戏
雷峰网
雷峰网
爱范儿
爱范儿
酷 壳 – CoolShell
酷 壳 – CoolShell
MongoDB | Blog
MongoDB | Blog

博客园 - venjiang

发布Asp.Net Forums V2.2.1929 官方中文Beta版 转换DotNetNuke为C#版 Asp.Net Forums 2.0.1 内部开发版系统文件说明 发布Asp.Net Forums V2 中文官方 10.1 国庆版 asp.net forums2 本地化版本0831发布(开源) Asp.Net Forums2 本地化工作记录0831 获取的本地区域为何不变?搞得我头都大了! Asp.Net Forums2组件库简要说明 [转贴]IIS6.0服务器无法访问解决方案总结 测试你的Blog价值 Data Access Application Block V2 类库中文文档 Data Access Application Block 3.1 博客园LOGO[修改版] DotNet开发人员现在应该下载的十种必备工具下载说明 Caching ASP.NET pages 卸载Windows Messenger 和高手过招 解决Automation 服务器不能创建对象 [Asp.Net Forums 2.0]增加Pager控件没有的跳转页功能
模拟Asp.Net Forums 2.0 数据提供者类
venjiang · 2004-08-02 · via 博客园 - venjiang

using System;

using System.Reflection;

namespace AbstractClass

{

    //===============================================================

    // 模拟Asp.Net Forums 2.0 数据提供者类实现,

    // 以实现多数据库支持特性.

    // 2004.8.2 by venjiang.

    // ==============================================================

    #region 主程序调用

    class Class1

    {

        [STAThread]

        static void Main(string[] args)

        {

            // 所有方法调用,都在BaseAbstact类进行,不涉及子类调用.

            // 这样只要派生类(SubClass)能够重写基类相应方法就可以了.

            // 调用基类静态方法

            BaseAbstract.BaseOut();

            // 调用派生类SubClassA

            BaseAbstract ba=BaseAbstract.Instance("AbstractClass.SubClassA", "Power by venjiang.");

            ba.BaseOut1();

            ba=BaseAbstract.Instance("AbstractClass.SubClassA", "venjiang", 28);

            ba.BaseOut2();

            // 调用派生类SubClassB

            ba=BaseAbstract.Instance("AbstractClass.SubClassB", "Power by venjiang.");

            ba.BaseOut1();

            ba=BaseAbstract.Instance("AbstractClass.SubClassB", "venjiang", 28);

            ba.BaseOut2();

            Console.Read();

        }

    }

    #endregion

    #region 相当于ForumsDataProvider类

    public abstract class BaseAbstract

    {

        public static BaseAbstract Instance(string subClassType, string name)

        {

            Type myType=null;

            // 获取派生类的类型,在Forums2中subClassType这个类型由Web.config文件中<providers>下的type指定.

            myType = Type.GetType( subClassType );

            // 构建构造函数参数类型数组

            Type[] types = new Type[1];

            types[0] = typeof(string);

            // 获取指定参数的派生类的构造函数

            ConstructorInfo ci = myType.GetConstructor(types);

            // 指定派生类参数值

            object[] paramArray = new object[1];

            paramArray[0] = name;

            return (BaseAbstract)ci.Invoke(paramArray);

        }

        public static BaseAbstract Instance(string subClassType, string name, int height)

        {

            Type myType=null;

            // 获取派生类的类型

            myType = Type.GetType( subClassType );

            // 构建构造函数参数类型数组

            Type[] types = new Type[2];

            types[0] = typeof(string);

            types[1] = typeof(int);

            // 获取指定参数的派生类的构造函数

            ConstructorInfo ci = myType.GetConstructor(types);

            // 指定派生类参数值

            object[] paramArray = new object[2];

            paramArray[0] = name;

            paramArray[1] = height;

            return (BaseAbstract)ci.Invoke(paramArray);

        }

        public static void BaseOut()

        {

//          Type myType=null;

//          myType = Type.GetType("AbstractClass.SubClassA");

            Console.WriteLine("[基类]这是抽象类的静态方法");

//          Console.WriteLine("测试{0}",myType.ToString());

        }

        public abstract void BaseOut1();

        public abstract void BaseOut2();

    }

    #endregion

    #region 相当于SqlDataProvider类

    public class SubClassA:BaseAbstract

    {

        private string _name="";

        private int _height=0;

        public SubClassA(string name)

        {

            _name=name;

        }

        public SubClassA(string name,int height)

        {

            _name=name;

            _height=height;

        }

        public override void BaseOut1()

        {

            Console.WriteLine("[派生类A]重写基类BaseOut1方法,"+ _name);

        }

        public override void BaseOut2()

        {

            Console.WriteLine("[派生类A]重写基类BaseOut2方法,"+ _name + "," + _height.ToString());

        }

    }

    #endregion

    #region  相当于其它数据库支持类

    public class SubClassB:BaseAbstract

    {

        private string _name="";

        private int _height=0;

        public SubClassB(string name)

        {

            _name=name;

        }

        public SubClassB(string name,int height)

        {

            _name=name;

            _height=height;

        }

        public override void BaseOut1()

        {

            Console.WriteLine("[派生类B]重写基类BaseOut1方法,"+ _name);

        }

        public override void BaseOut2()

        {

            Console.WriteLine("[派生类B]重写基类BaseOut2方法,"+ _name + "," + _height.ToString());

        }

    }

    #endregion

}

运行结果如下: