这为C#? 通过类类型作为参数
我有一个实现接口的类适配器。 我想填充数组结构与MyFooClass情况,其中MyFooClass的名称或引用我想从外界收到它。 我将他们实例化我的适配器代码中。
例如:
public void FillWsvcStructs(DataSet ds, ClassType Baz)
{
IFoo.Request = ds.DataTable[0].Request;
IFoo.Modulebq = string.Empty;
IFoo.Clasific = string.Empty;
IFoo.Asignadoa = ds.DataTable[0].Referer;
IFoo.Solicita = "Jean Paul Goitier";
// Go with sub-Elems (Also "Interfaceated")
foreach (DataSet.DataTableRow ar in ds.DataTable[1])
{
if ((int) ar.StatusOT != (int)Props.StatusOT.NotOT)
{
///From HERE!
IElemRequest req = new (Baz)(); // I don't know how to do it here
///To HERE!
req.Id = string.Empty;
req.Type = string.Empty;
req.Num = string.Empty;
req.Message = string.Empty;
req.Trkorr = ar[1];
TRequest.Add(req);
}
}
}
泛型和它们的约束应该做你想要什么,我相信:
public void FillWsvcStructs<ClassType>(DataSet ds) where ClassType : IElemRequest, new()
{
IFoo.Request = ds.DataTable[0].Request;
IFoo.Modulebq = string.Empty;
IFoo.Clasific = string.Empty;
IFoo.Asignadoa = ds.DataTable[0].Referer;
IFoo.Solicita = "Jean Paul Goitier";
// Go with sub-Elems (Also "Interfaceated")
foreach (DataSet.DataTableRow ar in ds.DataTable[1])
{
if ((int) ar.StatusOT != (int)Props.StatusOT.NotOT)
{
IElemRequest req = new ClassType();
req.Id = string.Empty;
req.Type = string.Empty;
req.Num = string.Empty;
req.Message = string.Empty;
req.Trkorr = ar[1];
TRequest.Add(req);
}
}
}
这可能是最好的使用泛型解决:
public void FillWsvcStructs<T>(DataSet ds) where T : IElemRequest, new()
{
//..
//new() constraint enables using default constructor
IElemRequest req = new T();
//IElemRequest constraint enables using interface properties
req.Id = string.Empty;
//..
}
如果你有,你需要能够访问/实例化多种类型,声明遵循相同的规则(如可以很容易地从MSDN收集):
public void FillWsvcStructs<T, U, V>() where T : IElemRequest, new()
where U : IFoo, new()
where V : IBar, new()
{
//..
}
我想你想的仿制药 。
声明你这样的方法:
public void FillWsvcStructs<T>(DataSet ds)
where T : IElemRequest, new()
{
//You can then do
IElemRequest req = new T();
}
在new()
约束要求T
有一个公共的无参数的构造函数,和IElemRequest
约束可以确保它实现IElemRequest
。
你需要一个通用的 :
public void FillWsvcStructs<TBaz>(DataSet ds) where TBaz : IElementRequest, new()
{
// ...
IElementRequest req = new TBaz();
// ...
}
通用约束(“ where...
”),强制您传递的类型实现了IElementRequest
接口,它有一个参数的构造函数。
假设你有一个类Baz
与此类似:
public class Baz : IElementRequest
{
public Baz()
{
}
}
你会调用像这样这个方法:
DataSet ds = new DataSet();
FillWsvcStructs<Baz>(ds);
附录
多个不同的,泛型类型参数可以各自具有自己的存在类型约束:
public void FillWsvcStructs<TFoo, TBar, TBaz>(DataSet ds)
where TFoo : IFoo, new()
where TBar : IBar, new()
where TBaz : IElementRequest, new()
{
// ...
IFoo foo = new TFoo();
IBar bar = new TBar();
IElementRequest req = new TBaz();
// ...
}
你可能想使用Activator.CreateInstance 。
IElemRequest req = (IElemRequest) Activator.CreateInstance(Baz);
如果该类型Baz
表示有一个构造函数参数,在那复杂性将增加(因为你将不得不使用反射或动态调用,使其工作)。 如果Baz
并不代表从继承的类型IElemRequest
,你会得到一个丑陋的运行时错误。
方法:
public void FillWsvcStructs<T>(DataSet ds) where T : IElemRequest, new() {
...
IElemRequest req = new T();
...
}
调用方法:
FillWsvcStructs<Bez>(ds);