加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 获取泛型抽象类的所有继承类

发布时间:2020-12-15 08:00:39 所属栏目:百科 来源:网络整理
导读:我正在寻找一些方法来获取继承通用抽象类的所有类,并对每个类执行一个方法. 我一直在关注这个Change parameter type when implementing an abstract method以获得我想要的类实现,类似于: public abstract class AbstractRequestTResponseData where TRespon
我正在寻找一些方法来获取继承通用抽象类的所有类,并对每个类执行一个方法.

我一直在关注这个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上的类型约束.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读