c# - 获取通用抽象类的所有继承类

标签 c# inheritance abstract

我正在寻找某种方法来获取所有继承通用抽象类的类,并对每个类执行一个方法。

我一直在关注这个 Change parameter type when implementing an abstract method拥有我想要的类实现,类似于此:

public abstract class AbstractRequest<TResponseData>
                where TResponseData : IResponseData
{
    public abstract void Search();
    public abstract GoodData BindData(TResponseData data);
}

public interface IResponseData
{
}

public class AResponse : IResponseData
{
}

public class BResponse : IResponseData
{
}

public class A : AbstractRequest<AResponse>
{
    public override void Search()
    {
        // get AResponse
        // Call to BindData() with AResponse
    }
    public override GoodData BindData(AResponse data)
    {
        // Bind the data from AResponse to GoodData
    }
}

public class B : AbstractRequest<BResponse>
{
    public override void Search()
    {
        // Get BResponse
        // Call to BindData() with BResponse
    }
    public override GoodData BindData(BResponse data)
    {
        // Bind the data from BResponse to GoodData
    }
}    

这是有效的查找,直到我需要获取所有 A 和 B 类并调用 Search()每个类的方法。对于非泛型抽象类,我可以使用以下代码片段来获取类

var instances = from t in Assembly.GetExecutingAssembly().GetTypes()
                where t.IsSubclassOf(typeof(AbstractRequest))
                    && t.GetConstructor(Type.EmptyTypes) != null
                select Activator.CreateInstance(t) as AbstractRequest;

那么,我怎样才能得到所有继承自 AbstractRequest<AResponse> 的类 A 和 B?和 AbstractRequest<BResponse>

编辑:我忘了说了。假设将有许多类似于 A 或 B 的实现,并且会随着时间的推移而增加。我希望有一个“优雅”(如果可能的话)的解决方案,所以以后我只需要负责实现 C、D 等。

谢谢!

最佳答案

实际上可以通过分解抽象类来让实例调用 Search()(并且只调用搜索):

public abstract class AbstractRequest
{
    public abstract void Search();
}

public abstract class AbstractRequest<TResponseData> : AbstractRequest
            where TResponseData : IResponseData
{
    public abstract GoodData BindData(TResponseData data);
}

然后您可以使用您的原始(非通用)代码:

var instances = from t in Assembly.GetExecutingAssembly().GetTypes()
    where t.IsClass &&
          typeof(AbstractRequest).IsAssignableFrom(t) &&
          t.GetConstructor(Type.EmptyTypes) != null
    select Activator.CreateInstance(t) as AbstractRequest;

(旧的,失败的解决方案)

我认为我会做这样的事情(未经测试):

var abstractRequestTypes =
    (from t in Assembly.GetExecutingAssembly().GetTypes()
     where t.IsClass &&
          typeof(IResponseData).IsAssignableFrom(t)
     select typeof(AbstractRequest<>).MakeGenericType(t)).ToList();

var instanceTypes = from t in Assembly.GetExecutingAssembly().GetTypes()
    where t.IsClass &&
          abstractRequestTypes.Any(dt => dt.IsAssignableFrom(t));

这应该涵盖继承层次结构中的任何内容,利用 AbstractRequest 上的类型约束。

关于c# - 获取通用抽象类的所有继承类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26261804/

相关文章:

c# - 打印 RDLC 报告而不显示 ReportViewer 控件

c# - 如何将图像添加到用户控件?

c# - C# 中的重载解析

c# - 在 C# 中使用派生返回类型覆盖抽象属性

python - 在子类python中调用基类方法

java - 比 Java 中的 If(x instanceof y) 更好的方法?

c# - 我应该在我的类中包装我的类自定义异常吗?

java - 获取鼠标事件不是抽象错误

java - 在抽象类中初始化最终变量 (Java)

Python 魔法元类创建