2012-04-10 7 views
2

Ich habe diese Klassen:Rischer Parameter in C#

interface Info{} 

class AInfo : Info { } 
class BInfo : Info { } 

class SendInfo { 
    static public f_WriteInfo(params Info[] _info) { 

    } 
} 

class Test { 
    static void Main() { 
    SendInfo.f_WriteInfo( 
         new[] { 
          new AInfo(){ ... }, 
          new BInfo(){ ... }, 
         }); 
// This will generate an error. 
// There will be need casting between new and [] like new Info[] 
    } 
} 

Gibt es eine Möglichkeit, dies zu tun, ohne zu Gießen?

Like:

class SendInfo { 
    static public f_WriteInfo(params T _info) where T : Info { 
+4

Was ist falsch mit 'neuen Info []' nützlich sein wird? Es wirft nicht. Und technisch brauchen Sie kein Array, Sie können Kommata-getrennte Argumente angeben, wenn Sie 'params' verwenden:' WriteInfo (info1, info2); ' –

+1

Nebenbei bemerkt bedeutet das Schlüsselwort' params', dass Sie nicht explizit angeben müssen Erstellen Sie ein Array beim Aufruf der Methode, können Sie einfach 'MyMethod (firstParam, secondParam, thirdParam);' –

+0

das Problem ist, dass 'new []' als 'object []' interpretiert wird, in diesem Zusammenhang –

Antwort

11

Ihre Methodensignatur einzustellen:

static public f_WriteInfo(params Info[] _info) {} 

und nennen es mag:

SendInfo.f_WriteInfo(new AInfo(){ ... }, new BInfo(){ ... }); 
2

Versuch:

namespace ConsoleApplication1 
{ 
    interface Info{} 

public class AInfo : Info 
{ 
    public AInfo(){} 
} 
public class BInfo : Info { } 

class SendInfo { 
    public static void f_WriteInfo(params Info[] _info) { 

    } 
} 


class Program 
{ 
    static void Main(string[] args) 
    { 
     SendInfo.f_WriteInfo( 
        new Info[] { 
         new AInfo(), 
         new BInfo() 
        }); 
    } 
} 

}

+0

Ich möchte nicht mit 'Info' sprechen. Ich meine das will wie 'new [] {new AInfo(), new BInfo()}' verwenden. Um dies zu tun, kann ich 'where' Ausdruck irgendwo hinzufügen? – uzay95

+0

Ich habe genau das versucht - es funktioniert – LuckSound

+0

Dann SendInfo.f_WriteInfo (neue AInfo() {...}, neue BInfo() {...}); ist am besten – LuckSound

4

das funktioniert gut

interface Info { } 

class AInfo : Info { } 
class BInfo : Info { } 

class SendInfo 
{ 
    public static void f_WriteInfo(params Info[] _info) 
    { 
    } 
} 

class Test 
{ 
    static void Main() 
    { 
     SendInfo.f_WriteInfo(new AInfo(), new BInfo()); 
    } 
} 
1

Von MSDN

Das Schlüsselwort params Sie eine Methode Parameter angeben können, die eine variable Anzahl von Argumenten entgegennimmt. Sie können eine durch Kommas getrennte Liste mit Argumenten des in der Parameterdeklaration angegebenen Typs oder ein Array mit Argumenten des angegebenen Typs senden. Sie können auch keine Argumente senden.

So müssen Sie new [] vor Argumenten nicht schreiben.

Ich denke, das Link unten auch
how-to-pass-a-single-object-to-a-params-object