C# 使用带有泛型的基类创建类型的实例

C# 使用带有泛型的基类创建类型的实例,c#,generics,activator,C#,Generics,Activator,我在代码中创建了一个插件系统,它从DLL加载类型。我使用此代码从加载的DLL中获取所需的类型 var type = Assembly.LoadFrom(filePath).GetTypes() .FirstOrDefault(t => t.IsClass && t.IsSubclassOfRawGeneric(typeof(DespatchBasePlugin<>)));

我在代码中创建了一个插件系统,它从DLL加载类型。我使用此代码从加载的DLL中获取所需的类型

var type = Assembly.LoadFrom(filePath).GetTypes()
                    .FirstOrDefault(t =>
                        t.IsClass && t.IsSubclassOfRawGeneric(typeof(DespatchBasePlugin<>)));
我肯定我在做傻事,请告诉我是什么


编辑-未将此标记为重复,因为我认为这是一个比另一个更好的问题/答案,其中包含指向MSDN的通用链接作为答案。如果这不是使用复制系统的正确方法,请让我知道。

您可以使用反向定义插件:

public class Program
{
    public static void Main()
    {
        var settings = new DerivedSettings()
        {Name = "John"};
        DerivedPlugin a = new DerivedPlugin(settings);
        IPlugin<BaseSettings> sample = (IPlugin<BaseSettings>)a;
        Console.WriteLine(sample.GetName());
    }
}

public abstract class BaseSettings
{
    public abstract string Name
    {
        get;
        set;
    }
}

public interface IPlugin<out TSettings>
    where TSettings : BaseSettings
{
    string GetName();
}

public abstract class BasePlugin<TSettings> : IPlugin<TSettings> where TSettings : BaseSettings
{
    protected readonly TSettings _settings;
    public BasePlugin(TSettings settings)
    {
        _settings = settings;
    }

    public virtual string GetName()
    {
        return _settings.Name;
    }
}

public class DerivedSettings : BaseSettings
{
    public override string Name
    {
        get;
        set;
    }
}

public class DerivedPlugin : BasePlugin<DerivedSettings>
{
    public DerivedPlugin(DerivedSettings settings): base (settings)
    {
    }
}
公共类程序
{
公共静态void Main()
{
var设置=新的DerivedSettings()
{Name=“John”};
DerivedPlugin a=新的DerivedPlugin(设置);
IPlugin样本=(IPlugin)a;
Console.WriteLine(sample.GetName());
}
}
公共抽象类基本设置
{
公共抽象字符串名
{
得到;
设置
}
}
公共接口IPlugin
其中TSettings:BaseSettings
{
字符串GetName();
}
公共抽象类BasePlugin:IPlugin其中TSettings:BaseSettings
{
受保护的只读设置\u设置;
公共BasePlugin(设置设置)
{
_设置=设置;
}
公共虚拟字符串GetName()
{
返回_settings.Name;
}
}
公共类派生设置:基本设置
{
公共重写字符串名
{
得到;
设置
}
}
公共类DerivedPlugin:BasePlugin
{
公共DerivedPlugin(DerivedSettings设置):基本(设置)
{
}
}

我已经包含了一个BasePlugin类,但这是可选的,您可以直接使用该接口。

您可以向我们展示它实例化的类的类声明,以及
DispatchBasePlugin
的定义吗?更新了,谢谢John。我错过了基类的基类,它大约有4层,不确定你是否需要所有的基类?我想这就足够了。让我找到正确的SO帖子来帮助你。可能是@tonyenkiducx的重复。这里有一篇来自codeproject的旧文章,可能会有帮助。我不再写全部内容:)顺便说一句,John写的东西看起来很相似。我意识到这很糟糕,但我想我必须添加一个接口“包装器”,然后我必须在使用时将插件转换为BasePlugin类型。这是遗留代码…解决方案中有54个项目…无法全部重写。标记为答案。。不要将其标记为重复,因为我相信这个问题和答案比另一个好。您的答案更加明确,并显示了解决方案,而不仅仅是指向MSDN文章。
public class DHLPlugin : DespatchBasePlugin<UserSetting>
{
    public DHLPlugin(BaseForm logger) : base("DHL", logger)
    {
        this.order = 10;
    }
}
public abstract class DespatchBasePlugin<TSettings> : DespatchBase<TSettings> where TSettings : XMLSettingBase, new()
DespatchBasePlugin obj = Activator.CreateInstance(type, new object[] { logger }) as DespatchBasePlugin;
public class Program
{
    public static void Main()
    {
        var settings = new DerivedSettings()
        {Name = "John"};
        DerivedPlugin a = new DerivedPlugin(settings);
        IPlugin<BaseSettings> sample = (IPlugin<BaseSettings>)a;
        Console.WriteLine(sample.GetName());
    }
}

public abstract class BaseSettings
{
    public abstract string Name
    {
        get;
        set;
    }
}

public interface IPlugin<out TSettings>
    where TSettings : BaseSettings
{
    string GetName();
}

public abstract class BasePlugin<TSettings> : IPlugin<TSettings> where TSettings : BaseSettings
{
    protected readonly TSettings _settings;
    public BasePlugin(TSettings settings)
    {
        _settings = settings;
    }

    public virtual string GetName()
    {
        return _settings.Name;
    }
}

public class DerivedSettings : BaseSettings
{
    public override string Name
    {
        get;
        set;
    }
}

public class DerivedPlugin : BasePlugin<DerivedSettings>
{
    public DerivedPlugin(DerivedSettings settings): base (settings)
    {
    }
}