2010-08-29 20 views
13

Si tengo algunos tipos por ejemplo:C# asignar automáticamente la propiedad basada en otra propiedad valores

public class SomeType //Generated by some codegen i won't to change that. 
{ 
    string C { get; set; }   
} 

public class AnotherType : SomeType 
{ 
    string A { get; set; } 
    string B { get; set; } 
} 

¿Es posible asignar automáticamente inmueble C? Por ejemplo, cuando las propiedades A y B se asignan o cuando estoy Transmitiendo este tipo a algún otro tipo, o de alguna otra manera?

Básicamente, por ejemplo, deseo ejecutar un poco de lógica para asignar automáticamente la propiedad C de acuerdo con los valores A y B en algún momento cuando los valores de las propiedades A y B se llenen.

¿Hay alguna otra forma de hacerlo en lugar de usar propiedades estándar?

Estaba pensando que es posible hacer un poco de magia cuando puedo lanzar el tipo AnotherType a SomeType, pero no puedo implementar el operador implícito donde puedo poner esta lógica de conversión "de A + B a C" porque el compilador no no permite operadores implícitos para tipos relacionados.

Ahora, solo veo la forma de eliminar la herencia e implementar el operador implícito para AnotherType a la conversión SomeType, pero el mal en ese caso necesito duplicar todas las propiedades del tipo SomeType dentro del tipo AnotherType y tengo que cambiar el tipo AnotherType manualmente cada momento en que SomeType se cambia.

Respuesta

15

Esto es posible utilizando las propiedades implementadas automáticamente. Se podría utilizar el colocador de B para asignar un valor a C:

public class SomeType 
{ 
    public string A { get; set; } 
    public string C { get; set; } 

    private string _b; 
    public string B 
    { 
     get { return _b; } 
     set 
     { 
      // Set B to some new value 
      _b = value; 

      // Assign C 
      C = string.Format("B has been set to {0}", value); 
     } 
    } 
} 
+0

I tener herencia no puedo modificar las propiedades – Kuncevic

+0

No está modificando los nombres o los tipos de las propiedades, solo la implementación de su getter y setter que no debe romper su herencia. –

+0

@bigb: Estoy confundido en cuanto a sus comentarios. ¿Estás diciendo que A y B, y posiblemente C, son propiedades automáticas dentro de una clase que estás heredando y que no puedes modificar? –

3

No, que yo sepa, que tendría que utilizar las propiedades estándar del pantano de la siguiente manera (en caso que sólo se conoce acerca de las propiedades automáticas)

public class SomeType 
{ 
    string _A; 
    string _B; 
    string _C; 

    public string A { get{return _A;} set{ _A = value; _C = _A + _B; } } 
    public string B { get{return _B;} set{ _B = value; _C = _A + _B; } 
    public string C { get{return _C}; } 
} 
+0

no puedo usar las propiedades estándar – Kuncevic

+3

@bigb, las propiedades autoaplicadas ** son ** las propiedades estándar. Son solo azúcar sintáctico que se compila en propiedades estándar, entonces sí ** puedes usar ** propiedades estándar, ya lo haces. –

+0

Sí, lo sé, actualicé la pregunta con más detalles – Kuncevic

4

¿Quieres ser capaz de establecer C, o simplemente conseguirlo? Si no es necesario ser capaz de establecer el valor, entonces yo creo que usted quiere esto:

public class MyClass 
{ 
    private string _a = "not set"; 
    private string _b = "not set"; 

    public string A 
    { 
     get { return _a; } 
     set { _a = value; } 
    } 

    public string B 
    { 
     get { return _b; } 
     set { _b = value; } 
    } 

    public string C 
    { 
     get 
     { 
      if (_a != "not set" && _b != "not set") 
       return "not set"; 
      else 
       return "set"; 
     } 
    } 
} 

Aquí hay un ejemplo más simple de acceder a una propiedad que depende de otra propiedad:

public class MyClass 
{ 
    private double[] MyArray = new double[5]; 

    public int NumElements 
    { 
     get 
     { 
      return MyArray.Length; 
     } 
    } 
} 
+0

Gracias. Solo necesito "obtener" la variable, y siempre tuvo sentido para mí poner este tipo de lógica en la variable que se cambia automáticamente de todos modos, ya que teóricamente la propiedad que afecta ('A' o' B') podría afectar muchas otras muchas variables – AlbatrossCafe

Cuestiones relacionadas