2016-06-27 11 views
1

ich so etwas wie dies zu tun, ich versuche:eine Eigenschaft erstellen mit vordefinierten Liste von Werten C#

eine Liste der Eigenschaften und Werte schaffen:

public class field_type 
{ 
    public static string NUMBER = "NUMBER"; 
    public static string VARCHAR = "VARCHAR"; 
    public static string BOOLEAN = "BOOLEAN"; 
    public static string DATE = "DATE"; 
} 

es dann für eine andere Eigenschaft als Typ verwenden :

public class field_definition 
{ 
    public string field_name; 
    public string field_description; 
    public field_type field_type;     <-- this one 
    public string field_size; 
    public bool primary_key; 
    public bool auto_increment; 
    public bool unsigned; 
    public string default_value; 
    public bool can_be_null; 
} 

dann wie folgt verwenden:

List<field_definition> field_defs1 = new List<field_definition>(); 
field_defs1.Add(new field_definition 
{ 
    field_type = 

}); 

Der Punkt ist, wenn ich Leerzeichen nach dem gleichen Symbol intellissense zeigt mir die Liste der verfügbaren Werte für diese Eigenschaft, wie es in VBA passiert, ist es möglich?

+1

Es ist ein bisschen schwer zu verstehen, was du hier meinst. 'field_type' kann nur eine Instanz der 'field_type'-Klasse enthalten, keine Strings. Sind Sie sicher, dass Sie nicht nach einem Enum suchen? –

Antwort

1

Warum verwenden Sie kein Enum?

enum field_type { NUMBER, VARCHAR, BOOLEAN, DATE }; 
List<field_definition> field_defs1 = new List<field_definition>(); 
field_defs1.Add(new field_definition 
{ 
    field_type = field_type.NUMBER; 

}); 
+0

Wo sagt er, dass er eine Schnur braucht? – CiccioRocca

+0

Ich sehe mich selbst, dass sie String sind. Mein Vorschlag war, einen anderen Ansatz zu verwenden. Dies ist aus dem Grund, dass er nicht spezifiziert, dass was er braucht, ein String ist. Warum all diese Polemik? – CiccioRocca

+0

Richtig, ich habe meine Kommentare gelöscht, deine Antwort falsch gelesen. Es löst immer noch nicht genau die Frage, die das OP stellt; intellisense * wird * standardmäßig auf 'field_type' gesetzt, aber Sie müssen noch' field_type.' eingeben, bevor die verfügbaren Werte angezeigt werden. OP fragt, ob es möglich ist, dass nach der Eingabe von '=' Werte angezeigt werden. – InBetween

0

nur für Ihr Interesse: Sie sollten kein Klassenname als Objektnamen verwenden: public field_type field_type;

Lösung:

List<field_definition> field_defs1 = new List<field_definition>(); 
field_defs1.Add(new field_definition() 
{ 
    auto_increment= true, 
    field_name = "lala", ... etc 

}); 

Sie haben vergessen, nur die runden Klammern vom Konstruktoraufruf :)

+0

in welcher Weise beantwortet das die Frage des OP? – InBetween

+1

OP's Frage: "Der Punkt ist, wenn ich Leerzeichen nach dem gleichen Symbol intellisense zeigt mir die Liste der verfügbaren Werte für diese Eigenschaft, wie es in VBA passiert ist, ist es möglich?" Dies passiert, wenn die Syntax korrekt ist ... –

+0

Nein, tut es nicht. – InBetween

0

Ihr Code wird nicht so funktionieren.

Sie können nur auf die Eigenschaften Ihrer field_type-Klasse wie field_type.NUMBER zugreifen. Aber Sie präzisieren, dass diese Eigenschaften statisch sind, also können Sie sie nicht ändern.

Wenn Sie einen Typ speichern, die immer Ihre Werte in field_type Klasse entsprechen, nehme ich an, dass der Code wie das sein wird:

Diese Klasse umfasst die verschiedenen Wert Ihres field_type gespeichert werden, nur zu speichern.

public static class field_type 
    { 
     public static string NUMBER = "NUMBER"; 
     public static string VARCHAR = "VARCHAR"; 
     public static string BOOLEAN = "BOOLEAN"; 
     public static string DATE = "DATE"; 
    } 

Ihre field_type hier ist ein String:

public class field_definition 
    { 
     public string field_name; 
     public string field_description; 
     public string field_type; 
     public string field_size; 
     public bool primary_key; 
     public bool auto_increment; 
     public bool unsigned; 
     public string default_value; 
     public bool can_be_null; 
    } 

Und Sie können es wie folgt verwenden:

List<field_definition> field_defs1 = new List<field_definition>(); 
     field_defs1.Add(new field_definition 
     { 
      field_type = field_type.NUMBER 
     }); 

Oder field_type=field_type.DATE oder alle Ihre Werte in der field_type Klasse.

0

Wo anfangen?

Wenn Sie field_type = eingeben und Leerzeichen eingeben, was erwartet der Compiler? Nun, die Antwort ist ... über alles; all dies sind gültige Optionen:

field_type = null; 
field_type = new field_type(); 
field_type = myFieldTypeVariableDeclaredBeforeInMyCode; 
field_type = 1; 
field_type = dlñfjasfjoafja; 
field_type = field_type.NUMBER; 

Alle sind gültige Optionen. Offensichtlich sind einige Kompilierzeitfehler.

Seltsamerweise scheinen Sie die letzte Option zu wollen: field_type = field_type.NUMBER was offensichtlich falsch ist. Sie bitten intellisense, Sie mit einer illegalen Zuweisung zu beauftragen; Zuweisen einer string zu einer typisierten Variablen field_type.

Aber vergessen Sie, dass es ein größeres Problem gibt, das verhindert, dass sich IntelliSense so verhält, wie Sie es sich wünschen. NUMBER, BOOLEAN usw. sind Namen, die nur innerhalb der Klasse field_type Sinn ergeben. Außerhalb der Klassendefinition bedeuten sie nichts, daher müssen Sie den Namen qualifizieren, um sicherzustellen, dass der Compiler es unterschreibt. Wie? Eingabe field_type.: field_type = field_type.NUMBER;. Jetzt field_type.NUMBER ist voll qualifiziert und der Compiler kann verstehen, was NUMBER ist: die Zeichenfolge "NUMBER".

Sie feststellen, dass, wenn Sie . getroffen nachfield_type den Compiler eingeben wird alle verfügbaren Optionen glücklich zeigen. Das liegt daran, dass es jetzt 100% sicher ist, dass Ihnen keine anderen möglichen Optionen zur Verfügung stehen.

Aber der Compiler nicht Prompt Sie bei allen möglichen Werten nach = becuase es die Eingabe nicht genügend Informationen, um eine fundierte Vermutung zu machen, was als nächstes kommt: wieder, all dies ist legal:

field_type = null; 
field_type = new field_type(); 
field_type = myFieldTypeVariableDeclaredBeforeInMyCode; 
field_type = field_type.//whatever; 

Warum sollte es entscheiden field_type. ist die beste Option?

Am nächsten kommt man mit enums zum gewünschten Verhalten. In diesem Fall wird zumindest Intellisense auf den Enum-Typ zurückgreifen, da die Chancen sehr hoch sind, dass genau das als nächstes kommt.