如何使用相同的方法让一个对象可以是任何 class?

How can I have one object that can be any class with the same methods?

我有一个基本的 c# 应用程序来处理一些 sql 文件。我对每种类型的对象都有一个 class,例如 proc、函数、视图等

我主要想做的是确定我正在处理哪种脚本文件,然后他们创建该文件的实例 class。

然后使用该对象,将其称为 objSqlType,我想在底层 class 中调用一个方法。每个 class 将具有相同的方法名称,如 getHeader()、getPermissions() 等

这可能吗。我查看了迫使我创建方法但似乎无法使用单个对象的接口,

例如:

object objSqlType;

switch (type)
{
    case ObjectType.PROC:
        objSqlType = new SqlProc();
        break;
    case ObjectType.FUNCTION:
        objSqlType = new SqlFunction();
        break;
    case ObjectType.VIEW:
        objSqlType = new SqlView();
        break;
    default:
        break;
}

string header = objSqlType.getHeader();  // call getHeader for whichever object I created

使用dynamic

dynamic objSqlType;

// rest of code

string header = objSqlType.getHeader();

此外,您似乎在这里使用了未初始化的变量,因为如果您属于 default 情况,则 objSqlType 未初始化,您不能使用未初始化的局部变量。

创建一个接口并让每个对象实现它。或者,创建一个抽象 class 并使每个对象都继承它。

  1. 创建界面
  2. 创建实现该接口的类
  3. 将您的对象声明为该接口
  4. 将您的对象实例化为实现接口
  5. 的类之一

像这样:

public interface ISqlType
{
    string getHeader();
}

public class SqlProc : ISqlType
{
    public string getHeader()
    {
        return "I'm a SqlProc!"
    }
}

public class SqlFunction : ISqlType
{
    public string getHeader()
    {
        return "I'm a SqlFunction!"
    }
}

public class SqlView : ISqlType
{
    public string getHeader()
    {
        return "I'm a SqlView!"
    }
}

ISqlType objSqlType;

switch (type)
{
    case ObjectType.PROC:
        objSqlType = new SqlProc();
        break;
    case ObjectType.FUNCTION:
        objSqlType = new SqlFunction();
        break;
    case ObjectType.VIEW:
        objSqlType = new SqlView();
        break;
    default:
        break;
}

string header = objSqlType.getHeader();

下面的代码可能对您有所帮助。我不确定你是否要从客户端删除创建新对象并使其集中化。

你可以考虑用解耦的方式提出你的需求 喜欢..

interface IDBObject
{
     string GetDBType()
}

then have your required classes and implement respect interface

public class SQLStoreProc:IDBObject
{
     public string GetDBType()
     {}
}

public class SQLFunction:IDBObject
{
public string GetDBType()
     {}
}

public class SQLMisc:IDBObject
{
public string GetDBType()
     {}
}

现在创建包装器或工厂 class,这将是

class clsFactory
{
     public static IDBObject CreateObject(string type)
     {
      IDBObject ObjSelector = null;

        switch (type)
        {
            case "SP":
                ObjSelector = new SQLStoreProc();
                break;
            case "FUNC":
                ObjSelector = new SQLFucntion();
                break;
            default:
                ObjSelector = new SQLMisc();
                break;
        }
        return ObjSelector;
     }
}

现在在 main 方法中你可以有类似下面的内容

public static void main (args a)
{
    IDBObject ObjIntrface = null;
    ObjIntrface = clsFactory.CreateObject(your object type);
    string res = ObjIntrface.GetDBType("First", "Second");

}