Ngo*_*ham 7 c# inheritance abstract
我正在寻找一些方法来获取所有继承通用抽象类的类,并对每个类执行一个方法.
在实现抽象方法以获得我想要的类实现时,我一直在遵循这个Change参数类型,类似于:
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
}
}
Run Code Online (Sandbox Code Playgroud)
这是工作查找,直到我需要获取所有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;
Run Code Online (Sandbox Code Playgroud)
那么,怎样才能得到所有的类A和B继承AbstractRequest<AResponse>和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);
}
Run Code Online (Sandbox Code Playgroud)
然后您可以使用原始(非通用)代码:
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;
Run Code Online (Sandbox Code Playgroud)
(旧的、失败的解决方案)
我想我会做这样的事情(未经测试):
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));
Run Code Online (Sandbox Code Playgroud)
这应该涵盖继承层次结构中的所有内容,利用AbstractRequest.
| 归档时间: |
|
| 查看次数: |
3699 次 |
| 最近记录: |