2009-04-14 12 views
8

Questo potrebbe essere un po 'un anti-pattern, ma è possibile che una proprietà in una classe C# accetti più valori?Una proprietà C# può accettare più valori?

Ad esempio, supponiamo di avere una proprietà int pubblica e desidero sempre che restituisca un int, ma vorrei poter impostare la proprietà assegnando un numero decimale, un intero o un altro tipo di dati. Quindi la mia domanda è se è possibile che le proprietà accettino più valori?

risposta

10

Credo che ciò che si intende porre è: Come si fa implicit e explicit scacciando lavoro per int e decimal?

Si sta interrogando sulla trasmissione implicita che copre automaticamente un oggetto in un altro tipo definito. Non è possibile eseguire questa operazione per un int e decimal perché sono già definiti nel framework e non è possibile ridurre l'ambito dello decimal eseguendolo su un int. Ma se lo stavi usando come esempio per gli oggetti reali che hai creato puoi usare il link implicit sopra, per saperne di più su come funziona e come implementarlo.

Ma è sempre possibile utilizzare il metodo di conversione per convertirli nel tipo corretto;

public int MyProperty { get; set; } 
... 
obj.MyProperty = Convert.ToInt32(32.0M); 
obj.MyProperty = Convert.ToInt32(40.222D); 
obj.MyProperty = Convert.ToInt32("42"); 
+0

Stavo usando ints e decimali più come un esempio ma è correlato. In sostanza voglio solo essere in grado di assegnare più tipi diversi a una singola proprietà e lasciare che la proprietà elabori cosa restituire. Come hai detto, il casting implicito permetterà questo. – lomaxx

+0

L'unica altra cosa che aggiungerò è che mentre il cast implicito risolverà il problema, non sembra che limiti l'ambito. Funzionerà bene per quello che sto cercando di fare, ma posso vedere potenziali problemi con il casting im (ex) se ho bisogno di regole specifiche per ogni cast. – lomaxx

+0

Con tutto ciò che ho detto, penso ancora che quello che sto cercando di fare è un anti-pattern e probabilmente sarebbe meglio servirlo o farlo in un linguaggio dinamico dove posso assegnargli tutto ciò che voglio, o ripensare a quello che sto facendo per evitare il problema, in primo luogo. – lomaxx

-1

Le proprietà dovrebbero assomigliare a dei campi pubblici. Crea metodi setter, o fai il cast/la conversione negli estratti conto di assegnazione in contrasto con il setter della proprietà.

0

No. Una proprietà ha un valore singolo. È possibile assegnare qualsiasi cosa che possa essere assegnata a una variabile dello stesso tipo.

+0

Questo non è vero, è possibile assegnarlo a qualsiasi oggetto che può essere espressamente castato. –

+0

@Nick Berardi: Non è accurato. Dopo averlo lanciato su un tipo diverso, stai assegnando il tipo diverso! –

+0

@John: d'accordo, non so cosa stia fumando Nick. – Samuel

1

Sembra che si debba accertare il tipo in fase di esecuzione. Si potrebbe avere la proprietà accettare un oggetto, determinare il tipo e agire. Dovresti gettare delle eccezioni per cose che non ti aspetti, ovviamente. Come dici tu, probabilmente non il migliore, ma possibile. :)

2

Edit: Questo metodo non può essere utilizzato in quanto l'OP è specificamente legato alle proprietà.

Non credo sia possibile con la robustezza che descrivi. In questo caso è preferibile utilizzare il metodo sovraccarico (polimorfismo).

Questo è quello che in genere è noto come setter (o mutatore) ed è possibile sovraccaricare il metodo per accettare più tipi diversi di parametri. Ognuno si esibirà in modo diverso se lo si desidera. Il modo in cui li ho impostati potrebbe non essere sintatticamente corretto, ma questa è l'idea generale che stai cercando, credo.

public class MyClass { 
    private Int32 mySomeValue; 
    public void setSomeValue(Double value) { this.mySomeValue = Convert.ToInt32(value); } 
    public void setSomeValue(Int32 value) { this.mySomeValue = value; } 
} 
Problemi correlati