从string创建一个类并在其上执行一个方法

时间:2017-01-03 15:51:16

标签: c#

我有两个独立/不同的实施"产品"同步。它们应该基于同步"方向"设置。

因此,类在我的项目中存储如下:

enter image description here

两个类都是相同的构造函数和一个共同的公共"运行"方法 - 启动同步过程。

目前,我正在创建这些类中的任何一个的实例并执行" Run"像这样的方法:

private void RunProductSync()
{
    if (_organisation.Data.Settings.Sync.Direction == "IN")
    {
        // Sync IN
        (new Sync.IN.Product(
            _icApi, 
            _icLogger)).Run();
    }
    else if (_organisation.Data.Settings.Sync.Direction == "OUT")
    {
        // Sync OUT
        (new Sync.OUT.Product(
            _icApi,
            _icLogger)).Run();
    }
}

这种方法有效,但我想用方法调用实现动态类实例化。

我尝试过的一种方法使用.NET的Activator.CreateInstance功能,如下所示:

var sync = Activator.CreateInstance(
    Type.GetType(
        string.Format("Sync.{0}.Product",
            _organisation.Data.Settings.Sync.Direction)));

但是,为了能够对此对象执行Run方法,我仍然必须这样做:

if (_organisation.Data.Settings.Sync.Direction == "IN") {
    (sync AS Sync.IN.Product).Run();
} else if (_organisation.Data.Settings.Sync.Direction == "OUT") {
    (sync AS Sync.OUT.Product).Run();
}

这仍然没有比我开始时更好。有更好的方法吗?

更新

感谢@ theo - 我有以下工作对我有用:

ISync.cs

interface ISync
{
    void Run();
}

Sync / IN / Product.cs & 同步/ OUT / Product.cs

public class Product : ISync
{
    public Product(Api _icApi, Logger _icLogger)
    { ... }

    public void Run()
    { ... }
}

类是动态实例化的&方法执行如下:

((ISync)Activator.CreateInstance(
    Type.GetType(
        string.Format("Sync.{0}.Product",
            _organisation.Data.Settings.Sync.Direction)),
    _icApi,
    _icLogger).Run(); 

1 个答案:

答案 0 :(得分:1)

尝试向两个类添加IProduct接口:

public interface IProduct
{
    void Run();
}

然后你可以这样做:

var sync = (IProduct)Activator.CreateInstance(
    Type.GetType(
        string.Format("Sync.{0}.Product",
            _organisation.Data.Settings.Sync.Direction)));

sync.Run();