C#对多个类/类型使用方法

C#对多个类/类型使用方法,c#,sqlite,C#,Sqlite,我喜欢对不同类型的类/类型使用一种方法。我可以这样做: class MyClass { private readonly Dictionary<string, Action<SQLLiteConnection>> _actions = new Dictionary<string, Action<SQLLiteConnection>>(); public MyClass() { _actions.Add("P

我喜欢对不同类型的类/类型使用一种方法。我可以这样做:

class MyClass
{
    private readonly Dictionary<string, Action<SQLLiteConnection>> _actions = new Dictionary<string, Action<SQLLiteConnection>>();

    public MyClass()
    {
        _actions.Add("Project", conn => conn.DropTable<Project>());
        _actions.Add("Task", conn => conn.DropTable<Task>());
    }

    public void ClearTable(string type)
    {
        try
        {
            using (var connection = new SQLiteConnection(platform, dbPath))
            {
                var action = _actions[type](connection);
                action(connection);
            }
        }
        catch (KeyNotFoundException ex1)
        { 
            Log.Info(String.Format("{0} is not a supported type.", type));
        }
        catch (SQLiteException ex2)
        {
            Log.Info("SQLiteEx", ex2.Message);
        }
    }
}
public void ClearTable<TType>()
{
    try
    {
        using (var connection = new SQLiteConnection(platform, dbPath))
        {
            connection.DropTable<TType>();
            connection.CreateTable<TType>();
        }
    }
    catch (SQLiteException ex)
    {
        Log.Info("SQLiteEx", ex.Message);
    }
}
public void ClearTable(字符串类型)
{
尝试
{
使用(var连接=新的SQLiteConnection(平台,dbPath))
{
开关(类型)
{
案例“项目”:
connection.DropTable();
connection.CreateTable();
打破
案例“任务”:
connection.DropTable();
connection.CreateTable();
打破
违约:
打破
}
}
}
catch(SQLiteException-ex)
{
Log.Info(“SQLiteEx”,ex.Message);
}
}
其中,例如DropTable中的“Project”是一个类的名称。但我更喜欢更一般的东西,比如(这是我不确定该怎么做的部分):

public void ClearTable(类型t)
{
尝试
{
使用(var连接=新的SQLiteConnection(平台,dbPath))
{
connection.DropTable();
connection.CreateTable();
}
}
catch(SQLiteException-ex)
{
Log.Info(“SQLiteEx”,ex.Message);
}
}

如何使用像最后一个方法这样的方法来支持多种类型的类?

取决于调用
ClearTable
的代码的外观

编译时绑定

如果它在编译时知道类型,您可以将原型更改为

public void ClearTable<T>() 
public void ClearTable()
…并称之为

var myClass = new MyClass();
myClass.ClearTable<Task>();   
var myClass=new myClass();
myClass.ClearTable();

myClass.ClearTable();
运行时绑定

如果直到运行时才知道类型,并且您确实必须将其作为这样的字符串传递,则可以设置如下委托字典:

class MyClass
{
    private readonly Dictionary<string, Action<SQLLiteConnection>> _actions = new Dictionary<string, Action<SQLLiteConnection>>();

    public MyClass()
    {
        _actions.Add("Project", conn => conn.DropTable<Project>());
        _actions.Add("Task", conn => conn.DropTable<Task>());
    }

    public void ClearTable(string type)
    {
        try
        {
            using (var connection = new SQLiteConnection(platform, dbPath))
            {
                var action = _actions[type](connection);
                action(connection);
            }
        }
        catch (KeyNotFoundException ex1)
        { 
            Log.Info(String.Format("{0} is not a supported type.", type));
        }
        catch (SQLiteException ex2)
        {
            Log.Info("SQLiteEx", ex2.Message);
        }
    }
}
public void ClearTable<TType>()
{
    try
    {
        using (var connection = new SQLiteConnection(platform, dbPath))
        {
            connection.DropTable<TType>();
            connection.CreateTable<TType>();
        }
    }
    catch (SQLiteException ex)
    {
        Log.Info("SQLiteEx", ex.Message);
    }
}
class-MyClass
{
专用只读词典_actions=new Dictionary();
公共MyClass()
{
_actions.Add(“Project”,conn=>conn.DropTable());
_actions.Add(“Task”,conn=>conn.DropTable());
}
公共void ClearTable(字符串类型)
{
尝试
{
使用(var连接=新的SQLiteConnection(平台,dbPath))
{
var action=_actions[type](连接);
行动(联系);
}
}
捕获(KeyNotFoundException ex1)
{ 
Log.Info(String.Format(“{0}不是受支持的类型。”,类型));
}
捕获(SQLiteException ex2)
{
Log.Info(“SQLiteEx”,ex2.Message);
}
}
}

取决于调用
ClearTable
的代码的外观

编译时绑定

如果它在编译时知道类型,您可以将原型更改为

public void ClearTable<T>() 
public void ClearTable()
…并称之为

var myClass = new MyClass();
myClass.ClearTable<Task>();   
var myClass=new myClass();
myClass.ClearTable();

myClass.ClearTable();
运行时绑定

如果直到运行时才知道类型,并且您确实必须将其作为这样的字符串传递,则可以设置如下委托字典:

class MyClass
{
    private readonly Dictionary<string, Action<SQLLiteConnection>> _actions = new Dictionary<string, Action<SQLLiteConnection>>();

    public MyClass()
    {
        _actions.Add("Project", conn => conn.DropTable<Project>());
        _actions.Add("Task", conn => conn.DropTable<Task>());
    }

    public void ClearTable(string type)
    {
        try
        {
            using (var connection = new SQLiteConnection(platform, dbPath))
            {
                var action = _actions[type](connection);
                action(connection);
            }
        }
        catch (KeyNotFoundException ex1)
        { 
            Log.Info(String.Format("{0} is not a supported type.", type));
        }
        catch (SQLiteException ex2)
        {
            Log.Info("SQLiteEx", ex2.Message);
        }
    }
}
public void ClearTable<TType>()
{
    try
    {
        using (var connection = new SQLiteConnection(platform, dbPath))
        {
            connection.DropTable<TType>();
            connection.CreateTable<TType>();
        }
    }
    catch (SQLiteException ex)
    {
        Log.Info("SQLiteEx", ex.Message);
    }
}
class-MyClass
{
专用只读词典_actions=new Dictionary();
公共MyClass()
{
_actions.Add(“Project”,conn=>conn.DropTable());
_actions.Add(“Task”,conn=>conn.DropTable());
}
公共void ClearTable(字符串类型)
{
尝试
{
使用(var连接=新的SQLiteConnection(平台,dbPath))
{
var action=_actions[type](连接);
行动(联系);
}
}
捕获(KeyNotFoundException ex1)
{ 
Log.Info(String.Format(“{0}不是受支持的类型。”,类型));
}
捕获(SQLiteException ex2)
{
Log.Info(“SQLiteEx”,ex2.Message);
}
}
}

您正在寻找泛型

使用泛型,您可以编写如下代码:

class MyClass
{
    private readonly Dictionary<string, Action<SQLLiteConnection>> _actions = new Dictionary<string, Action<SQLLiteConnection>>();

    public MyClass()
    {
        _actions.Add("Project", conn => conn.DropTable<Project>());
        _actions.Add("Task", conn => conn.DropTable<Task>());
    }

    public void ClearTable(string type)
    {
        try
        {
            using (var connection = new SQLiteConnection(platform, dbPath))
            {
                var action = _actions[type](connection);
                action(connection);
            }
        }
        catch (KeyNotFoundException ex1)
        { 
            Log.Info(String.Format("{0} is not a supported type.", type));
        }
        catch (SQLiteException ex2)
        {
            Log.Info("SQLiteEx", ex2.Message);
        }
    }
}
public void ClearTable<TType>()
{
    try
    {
        using (var connection = new SQLiteConnection(platform, dbPath))
        {
            connection.DropTable<TType>();
            connection.CreateTable<TType>();
        }
    }
    catch (SQLiteException ex)
    {
        Log.Info("SQLiteEx", ex.Message);
    }
}

现在,您只能将继承自
IDomainModel
的类型作为泛型参数。

您正在寻找泛型

使用泛型,您可以编写如下代码:

class MyClass
{
    private readonly Dictionary<string, Action<SQLLiteConnection>> _actions = new Dictionary<string, Action<SQLLiteConnection>>();

    public MyClass()
    {
        _actions.Add("Project", conn => conn.DropTable<Project>());
        _actions.Add("Task", conn => conn.DropTable<Task>());
    }

    public void ClearTable(string type)
    {
        try
        {
            using (var connection = new SQLiteConnection(platform, dbPath))
            {
                var action = _actions[type](connection);
                action(connection);
            }
        }
        catch (KeyNotFoundException ex1)
        { 
            Log.Info(String.Format("{0} is not a supported type.", type));
        }
        catch (SQLiteException ex2)
        {
            Log.Info("SQLiteEx", ex2.Message);
        }
    }
}
public void ClearTable<TType>()
{
    try
    {
        using (var connection = new SQLiteConnection(platform, dbPath))
        {
            connection.DropTable<TType>();
            connection.CreateTable<TType>();
        }
    }
    catch (SQLiteException ex)
    {
        Log.Info("SQLiteEx", ex.Message);
    }
}

现在,您只能将继承自
IDomainModel
的类型作为泛型参数提供。

将方法签名更改为:
public void ClearTable()
@Robert您正在寻找的是泛型吗(请参阅我的答案)或者您是被迫调用类型作为参数的方法并在运行时创建泛型方法的?请将您的方法签名更改为:
public void ClearTable()
@Robert您要找的是泛型吗(请参阅我的答案)或者您是被迫调用类型作为参数的方法,并在运行时创建泛型方法?我已经实现了Iqon的解决方案,它对我很有效。基于您的声誉和代码的“复杂性”、更好的错误处理等,我感觉您的代码将更稳定、更节省,并且更符合C#约定。我对C#非常陌生,希望成为一名更好的开发人员。为了让我成为一名更好的开发人员,不要说Iqon的解决方案不好——基本上是我的“坏”代码做得更好,你能确认你的代码比Iqon的“好”吗?如果您愿意,您还可以解释一下原因吗?我的解决方案的前半部分与Iqon完全相同,因此它不是“更好”,而是相等的:)后半部分仅在特殊情况下使用,其中类型必须作为字符串传递,并且仅在运行时确定。我已经实现了Iqon的解决方案,它对我有效。基于您的声誉和代码的“复杂性”,更好的错误处理等。