C#传递一个类类型作为参数(C# Passing a class type as a paramet

2019-07-29 17:57发布

这为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);
            }
        }
    }

Answer 1:

泛型和它们的约束应该做你想要什么,我相信:

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);
        }
    }
}


Answer 2:

这可能是最好的使用泛型解决:

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()
{

    //..
}


Answer 3:

我想你想的仿制药 。

声明你这样的方法:

public void FillWsvcStructs<T>(DataSet ds)
    where T : IElemRequest, new()
{
    //You can then do
    IElemRequest req = new T();

}

new()约束要求T有一个公共的无参数的构造函数,和IElemRequest约束可以确保它实现IElemRequest



Answer 4:

你需要一个通用的 :

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();
    // ...
}


Answer 5:

你可能想使用Activator.CreateInstance 。

IElemRequest req = (IElemRequest) Activator.CreateInstance(Baz);

如果该类型Baz表示有一个构造函数参数,在那复杂性将增加(因为你将不得不使用反射或动态调用,使其工作)。 如果Baz并不代表从继承的类型IElemRequest ,你会得到一个丑陋的运行时错误。



Answer 6:

方法:

public void FillWsvcStructs<T>(DataSet ds) where T : IElemRequest, new() {
    ...
    IElemRequest req = new T();
    ...
}

调用方法:

FillWsvcStructs<Bez>(ds);


文章来源: C# Passing a class type as a parameter
标签: c# oop interface