2009-04-14 16 views
8

Esto podría ser un poco anti-patrón, pero es posible que una propiedad en una clase C# acepte valores múltiples?¿Puede una propiedad C# aceptar múltiples valores?

Por ejemplo, supongamos que tengo una propiedad Int pública y siempre quiero que devuelva un int, pero me gustaría poder establecer la propiedad asignando un decimal, un entero o algún otro tipo de datos. Entonces, mi pregunta es si es posible que las propiedades acepten valores múltiples.

Respuesta

10

creo que lo que quiere decir que debemos hacernos es: ¿Cómo se implicit y explicit echando trabajo para int y decimal?

Está preguntando acerca de la fusión implícita que automáticamente convierte un objeto en otro tipo definido. No podrá hacer esto para un int y decimal porque ya están definidos en el marco y no puede reducir el alcance del decimal lanzándolo a un int. Pero si estaba usando eso como ejemplo para los objetos reales que creó, puede usar el enlace implicit que se encuentra arriba para obtener más información sobre cómo funciona esto y cómo implementarlo.

Pero siempre puede usar el método de conversión para convertirlos al tipo correcto;

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

Estaba usando Ints y decimales más como un ejemplo, pero está relacionado. Básicamente, solo quiero poder asignar múltiples tipos diferentes a una única propiedad y dejar que la propiedad determine qué devolver. Como mencionas, el casting implícito permitirá esto. – lomaxx

+0

La única otra cosa que agregaré es que, si bien la fusión implícita resolverá el problema, no parece limitar suficientemente el alcance. Funcionará bien para lo que estoy tratando de hacer, pero puedo ver problemas potenciales con el casting implícito (ex) si alguna vez necesito reglas específicas para cada lanzamiento. – lomaxx

+0

Dicho todo esto, sigo pensando que lo que estoy tratando de hacer es un antipatrón y probablemente sería mejor si lo hiciera en un lenguaje dinámico donde puedo asignarle lo que quiera, o repensar lo que estoy haciendo para evitar el problema en primer lugar. – lomaxx

-1

Se supone que las propiedades se ven como campos públicos. Cree métodos setter, o realice el molde/conversión en las declaraciones de asignación en lugar de en el conjunto de propiedades.

0

No. Una propiedad tiene un valor único. Puede asignarle cualquier cosa que pueda asignarse a una variable del mismo tipo.

+0

Eso no es cierto, puede asignarlo a cualquier objeto que se pueda convertir explícitamente. –

+0

@Nick Berardi: Eso no es exacto. Una vez que lo ha lanzado a un tipo diferente, ¡está asignando el tipo diferente! –

+0

@John: De acuerdo, no sé lo que Nick está fumando. – Samuel

1

Parece que tendrías que determinar el tipo en tiempo de ejecución. Puede hacer que la propiedad acepte un objeto, determine el tipo y realice su acción. Tendría que lanzar excepciones para cosas que no espera, por supuesto. Como dices, probablemente no sea el mejor, pero es posible. :)

2

Editar: Este método no se puede utilizar ya que el op se une específicamente a las propiedades.

No creo que esto sea posible con la robustez que usted describe. En este caso, probablemente sería mejor utilizar un método sobrecargado (polimorfismo).

Esto es lo que generalmente se conoce como setter (o mutador) y puede sobrecargar el método para aceptar múltiples tipos diferentes de parámetros. Cada uno funcionará de manera diferente si lo desea. La forma en que los configuro podría no ser sintácticamente correcta, pero esa es la idea general que estás buscando, creo.

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