5

これは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);
            }
        }
    }
4

6 に答える 6

8

ジェネリックその制約は、あなたが望むことをするはずです、私は信じています:

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);
        }
    }
}
于 2012-06-05T19:19:20.653 に答える
6

これは、ジェネリックを使用することでおそらく最もよく解決されます。

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

    //..
}
于 2012-06-05T19:17:51.693 に答える
4

genericsが必要だと思います。

次のようにメソッドを宣言します。

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

}

new()制約には、パブリックのパラメーターなしのコンストラクターが必要でTあり、IElemRequest制約により、確実に実装されIElemRequestます。

于 2012-06-05T19:18:28.267 に答える
3

ジェネリックが必要です:

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();
    // ...
}
于 2012-06-05T19:18:02.353 に答える
0

おそらくActivator.CreateInstanceを使用したいと思うでしょう。

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

Baz表す型にパラメーターを受け取るコンストラクターがある場合、その複雑さが増します (それを機能させるにはリフレクションまたは動的呼び出しを使用する必要があるため)。Bazが から継承する型を表していない場合IElemRequest、醜い実行時エラーが発生します。

于 2012-06-05T19:20:25.880 に答える
0

メソッド:

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

メソッドの呼び出し:

FillWsvcStructs<Bez>(ds);
于 2012-06-05T19:21:09.433 に答える